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

5 ответов:

Если вы не уверены, вы можете использовать запрос 'cols' на терминале и забыть столбцы:

COLS=$(tput cols)

просто краткое Примечание / резюме для всех, кто пришел сюда через Google, ища ответ на общий вопрос, заданный в названии (как и я). Любое из следующих действий должно работать для получения доступа к переменным оболочки внутри кавычек:

echo "$VARIABLE"
echo "${VARIABLE}"

использование одинарных кавычек является главной проблемой. Согласно Справочное Руководство Bash:

заключая символы в одинарные кавычки (') сохраняет литеральное значение каждого символа внутри цитата. Одинарная кавычка может отсутствовать между одинарными кавычками, даже если ей предшествует обратная косая черта. [...] Заключая символы в двойные кавычки (") сохраняет буквенное значение всех символов в кавычках, за исключением $,`,\, и, когда расширение истории включено,!. Персонажи $ и ' сохраняют свое особое значение в двойных кавычках (см. расширения оболочки). Обратная косая черта сохраняет свое особое значение только тогда, когда за ней следует один из следующих символов: $,`,",\, или символ новой строки. В двойных кавычках удаляются обратные косые черты, за которыми следует один из этих символов. Обратные косые черты предшествующих символов без специального значения остаются неизмененными. Двойная кавычка может быть заключена в двойные кавычки, предваряя ее обратной косой чертой. Если включено, расширение истории будет выполняться, если ! появление в двойных кавычках экранируется с помощью обратной косой черты. Обратная косая черта, предшествующая ! не снимается. Специальные параметры * и @ имеют особое значение, когда в двойных кавычках (см. расширение параметров оболочки).

в конкретном случае, заданном в вопросе, $COLUMNS-это специальная переменная, которая имеет нестандартные свойства (см. ответ lhunath выше).

отметим, что COLUMNS - это:

  1. не переменная окружения. Это обычный параметр bash, который устанавливается самим bash.
  2. устанавливается автоматически при получении 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 отдельно (подход снизу вверх).