Как использовать переменную окружения внутри строки, заключенной в кавычки, в Bash

StackOverflow https://stackoverflow.com/questions/840536

  •  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 является:

  1. НЕ переменная среды.Это обычный параметр bash, который устанавливается самим bash.
  2. Устанавливается автоматически при получении 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

Таким образом, ваш код становится более понятным для чтения и более модульным (подход "сверху вниз"), и вы можете тщательно тестировать код с различными столбцами по отдельности (подход "снизу вверх").

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top