Как использовать переменную среды внутри строки в кавычках в 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 отдельно (подход снизу вверх).