Как использовать переменную среды внутри строки в кавычках в Bash
Я пробовал различные формы следующего в скрипте bash:
#!/bin/bash
svn diff $@ --diff-cmd /usr/bin/diff -x "-y -w -p -W $COLUMNS"
но я не могу получить синтаксис, чтобы правильно расширить COLUMNS переменные среды.
Я пробовал различные формы следующие:
svn diff $@ --diff-cmd /usr/bin/diff -x '-y -w -p -W $COLUMNS'
и
svn diff $@ --diff-cmd /usr/bin/diff -x '-y -w -p -W ${COLUMNS}'
и
eval svn diff $@ --diff-cmd /usr/bin/diff -x "-y -w -p -W $COLUMNS"
предложения?
5 ответов:
Если вы не уверены, вы можете использовать запрос 'cols' на терминале и забыть столбцы:
COLS=$(tput cols)
просто краткое Примечание / резюме для всех, кто пришел сюда через Google, ища ответ на общий вопрос, заданный в названии (как и я). Любое из следующих действий должно работать для получения доступа к переменным оболочки внутри кавычек:
echo "$VARIABLE" echo "${VARIABLE}"использование одинарных кавычек является главной проблемой. Согласно Справочное Руководство Bash:
заключая символы в одинарные кавычки (
') сохраняет литеральное значение каждого символа внутри цитата. Одинарная кавычка может отсутствовать между одинарными кавычками, даже если ей предшествует обратная косая черта. [...] Заключая символы в двойные кавычки (") сохраняет буквенное значение всех символов в кавычках, за исключением$,`,\, и, когда расширение истории включено,!. Персонажи$и ' сохраняют свое особое значение в двойных кавычках (см. расширения оболочки). Обратная косая черта сохраняет свое особое значение только тогда, когда за ней следует один из следующих символов:$,`,",\, или символ новой строки. В двойных кавычках удаляются обратные косые черты, за которыми следует один из этих символов. Обратные косые черты предшествующих символов без специального значения остаются неизмененными. Двойная кавычка может быть заключена в двойные кавычки, предваряя ее обратной косой чертой. Если включено, расширение истории будет выполняться, если!появление в двойных кавычках экранируется с помощью обратной косой черты. Обратная косая черта, предшествующая!не снимается. Специальные параметры*и@имеют особое значение, когда в двойных кавычках (см. расширение параметров оболочки).в конкретном случае, заданном в вопросе, $COLUMNS-это специальная переменная, которая имеет нестандартные свойства (см. ответ lhunath выше).
отметим, что
COLUMNS- это:
- не переменная окружения. Это обычный параметр bash, который устанавливается самим bash.
- устанавливается автоматически при получении
SIGWINCHсигнал.этот второй пункт обычно означает, что ваш
COLUMNSпеременная будет установлена только в вашем interactive shell,не в bash-скрипт.если ваш скрипт
stdinподключен к терминал вы можете вручную посмотреть ширину вашего терминала, спросив свой терминал:tput colsи использовать это в вашей команде SVN:
svn diff "$@" --diff-cmd /usr/bin/diff -x "-y -w -p -W $(tput cols)"(Примечание: Вы должны цитата
"$@"и отeval; -))
следующий скрипт работает для меня для нескольких значений
$COLUMNS. Мне интересно, если вы неCOLUMNSдо этого вызова?#!/bin/bash COLUMNS=30 svn diff $@ --diff-cmd /usr/bin/diff -x "-y -w -p -W $COLUMNS"вы можете Эхо
$COLUMNSвнутри вашего скрипта, чтобы увидеть, если его правильно установить?
Вы делаете это правильно, поэтому я предполагаю, что что-то еще виновато (не экспортируя столбцы ?).
трюк для отладки этих случаев состоит в том, чтобы сделать специализированную команду (закрытие для парней языка программирования). Создайте сценарий оболочки с именем diff-columns doing:
exec /usr/bin/diff -x -y -w -p -W "$COLUMNS" "$@"и просто использовать
svn diff "$@" --diff-cmd diff-columnsтаким образом, ваш код чище для чтения и более модульный (нисходящий подход), и вы можете протестировать код diff-columns thouroughly отдельно (подход снизу вверх).