Как использовать переменную окружения внутри строки, заключенной в кавычки, в Bash
-
20-08-2019 - |
Вопрос
Я пробовал различные формы следующего в скрипте 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"
Предложения?
Решение
Если вы не уверены, вы можете использовать запрос 'cols' на терминале и забыть СТОЛБЦЫ:
COLS=$(tput cols)
Другие советы
Просто краткое примечание / резюме для всех, кто пришел сюда через Google в поисках ответа на общий вопрос, заданный в названии (как и я).Любое из следующих действий должно работать для получения доступа к переменным оболочки внутри кавычек:
echo "$VARIABLE"
echo "${VARIABLE}"
Использование одинарных кавычек является основной проблемой.В соответствии с Справочное руководство по Bash:
Заключение символов в одинарные кавычки (
'
) сохраняет буквальное значение каждого символа в кавычках.Одинарная кавычка может не заключаться в одинарные кавычки, даже если перед ней стоит обратная косая черта.[...] Заключающие символы в двойные кавычки ("
) сохраняет буквальное значение всех символов внутри кавычек, за исключением$
,`
,\
, и, когда расширение истории включено,!
.Персонажи$
и ` сохраняют свое особое значение в двойных кавычках (см. Расширения оболочки).Обратная косая черта сохраняет свое особое значение только тогда , когда за ней следует один из следующих символов:$
,`
,"
,\
, или новая строка.В двойных кавычках удаляются обратные косые черты, за которыми следует один из этих символов.Обратная косая черта, предшествующая символам без особого значения, остается неизмененной.Двойную кавычку можно заключить в двойные кавычки, поставив перед ней обратную косую черту.Если включено, расширение истории будет выполняться до тех пор, пока!
символ, заключенный в двойные кавычки, экранируется с помощью обратной косой черты.Обратная косая черта , предшествующая!
не удаляется.Специальные параметры*
и@
имеют особое значение, когда заключены в двойные кавычки (см. Расширение параметра оболочки).
В конкретном случае, заданном в вопросе, $COLUMNS - это специальная переменная, обладающая нестандартными свойствами (см. Ответ луната выше).
Обратите внимание , что COLUMNS
является:
- НЕ переменная среды.Это обычный параметр bash, который устанавливается самим bash.
- Устанавливается автоматически при получении
SIGWINCH
сигнал.
Этот второй момент обычно означает, что ваш COLUMNS
переменная будет установлена только в вашем интерактивный оболочка, не в скрипте 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, выполняющий:
exec /usr/bin/diff -x -y -w -p -W "$COLUMNS" "$@"
и просто используйте
svn diff "$@" --diff-cmd diff-columns
Таким образом, ваш код становится более понятным для чтения и более модульным (подход "сверху вниз"), и вы можете тщательно тестировать код с различными столбцами по отдельности (подход "снизу вверх").