$VAR по сравнению с $ {VAR} и заключить в кавычки или не заключить в кавычки

Ctrl-Q

Отключить это в целом, палку stty -ixon в сценарии запуска. Чтобы позволить любому ключу получать вещи, текущие снова, использовать stty ixany.

PS: Это ни терминал, ни оболочка, которая делает это, но терминальный драйвер ОС.

146
28.03.2011, 22:03
4 ответа

VAR=$VAR1 упрощенная версия VAR=${VAR1}. Существуют вещи, второе может сделать это, первое не может, например, сослаться на индекс массива (не портативный) или удалить (портативную POSIX) подстроку. Посмотрите Больше на разделе переменных Руководства Bash для Новичков и Расширения Параметра в спецификации POSIX.

Используя кавычки вокруг переменной как в rm -- "$VAR1" или rm -- "${VAR}" хорошая идея. Это делает содержание переменной атомарной единицей. Если значение переменной содержит пробелы (хорошо, символы в $IFS специальная переменная, пробелы по умолчанию) или globbing символы и Вы не заключаете его в кавычки, затем каждое слово рассматривают для поколения имени файла (globbing), чье расширение делает как много аргументов тому, что Вы делаете.

$ find .
.
./*r*
./-rf
./another
./filename
./spaced filename
./another spaced filename
./another spaced filename/x
$ var='spaced filename'
# usually, 'spaced filename' would come from the output of some command and you weren't expecting it
$ rm $var
rm: cannot remove 'spaced': No such file or directory
# oops! I just ran 'rm spaced filename'
$ var='*r*'
$ rm $var
# expands to: 'rm' '-rf' '*r*' 'another spaced filename'

$ find .
.
./another
./spaced filename
./another spaced filename
$ var='another spaced filename'
$ rm -- "$var"
$ find .
.
./another
./spaced filename

На мобильности: Согласно разделу POSIX.1-2008 2.6.2, фигурные скобки являются дополнительными.

105
27.01.2020, 19:28
  • 1
    @shawn обновил мой вопрос, потому что мне также любопытно на предмет мобильности –  xenoterracide 16.12.2010, 15:46
  • 2
    @shawn: Я сомневаюсь, что Ваш пример допустим. У Вас есть какой-либо реальный пример оболочки где var1=$var расширение дает ошибку? –  alex 16.12.2010, 16:48
  • 3
    @alex:Спасибо. я думал, что протестировал это на командной строке, но я сделал это неправильно. Я изменил пример. –  Shawn J. Goff 16.12.2010, 17:19
  • 4
    С обновленным примером, лучше иметь в виду, что обычно необходимо хотеть заключенную в кавычки версию как пример, является скорее угловым случаем. –  alex 16.12.2010, 18:15
  • 5
    @Shawn: кавычки не необходимы в присвоении. Они необходимы в большей части другого использования, включая export VAR=$VAR1. Что касается фигурных скобок, они являются дополнительными (проверьте четвертый абзац раздела, который Вы процитировали; дело обстоит так во всем предPOSIX и оболочках POSIX). –  Gilles 'SO- stop being evil' 16.12.2010, 21:13

${VAR} и $VAR точно эквивалентны. Для простого переменного расширения, единственная причина использовать ${VAR} когда парсинг иначе захватил бы слишком много символов в имя переменной, как в ${VAR1}_$VAR2 (который без фигурных скобок был бы эквивалентен ${VAR1_}$VAR2). Большинство украшенных расширений (${VAR:=default}, ${VAR#prefix}, …), требуют фигурных скобок.

В переменном присвоении полевое разделение (т.е. разделение в пробеле в значении) и расширение пути (т.е. globbing) выключены, таким образом, VAR=$VAR1 точно эквивалентно VAR="$VAR1", во всех оболочках POSIX и во всем предPOSIX sh, что я услышал о. (POSIX касательно: простые команды). По той же причине, VAR=* надежно наборы VAR к литеральной строке *; конечно, VAR=a b наборы VAR кому: a начиная с b отдельное слово во-первых. Вообще говоря, двойные кавычки являются ненужными, где синтаксис оболочки ожидает отдельное слово, например, в case … in (но не в шаблоне), но даже там необходимо быть осторожными: например, POSIX указывает то перенаправление цели (>$filename) не требуйте заключения в кавычки в сценариях, но несколько оболочек включая удар действительно требуют двойных кавычек даже в сценариях. Посмотрите, Когда двойное заключение в кавычки будет необходимо? для более полного анализа.

Вам действительно нужны двойные кавычки в других случаях, в особенности в export VAR="${VAR1}" (который может эквивалентно быть записан export "VAR=${VAR1}") во многих оболочках (POSIX оставляет этот случай открытым). Подобие этого случая с простыми присвоениями и рассеянная природа списка случаев, где Вам не нужны двойные кавычки, то, почему я рекомендую просто использовать двойные кавычки, если Вы действительно не хотите разделить и шарик.

64
27.01.2020, 19:28
  • 1
    Как правило я буду всегда заключать переменные расширения в кавычки, даже когда я знаю, что значение не будет содержать никого IFS символы, потому что я хочу быть в привычке. Одно исключение, я не заключаю значение в кавычки при делании уроки (если не требуется, такой как тогда, когда значение содержит пространство). Это делает подсветку синтаксиса редактора более полезной, когда существуют замены команды такой как FOO=$(BAR=$(BAZ=blah; printf %s "${BAZ}"); printf %s "${BAR}"). Вместо того, чтобы окрашивать все в "строковый" цвет, я получаю подсветку синтаксиса вложенного кода. Это также, почему я избегаю обратных галочек. –  Richard Hansen 04.01.2013, 21:19
  • 2
    В то время как >$file в порядке в сценариях POSIX, это не находится в ударе, даже когда неинтерактивная (если соблюдение POSIX не обеспечено с $POSIXLY_CORRECT или --posix...). –  Stéphane Chazelas 23.01.2013, 17:01
  • 3
    В то время как это верно, что кавычки не необходимы в VAR=$VAR1, Я иногда удивлялся local VAR=$VAR1, который я не забываю работать по-другому в некотором отношении по крайней мере в некоторых оболочках. Но банкомат, я не могу воспроизвести расхождение. –  dubiousjim 19.09.2015, 11:31
  • 4
    Хорошо, найденный проблемой я помнил. Это только обнаруживается в некоторых оболочках. –  dubiousjim 19.09.2015, 13:47
  • 5
    @dubiousjim local VAR=$VAR1 похож export VAR=$VAR1, это зависит от оболочки. –  Gilles 'SO- stop being evil' 19.09.2015, 16:17
ls -la

lrwxrwxrwx.  1 root root      31 Nov 17 13:13 prodhostname
lrwxrwxrwx.  1 root root      33 Nov 17 13:13 testhostname
lrwxrwxrwx.  1 root root      32 Nov 17 13:13 justname

end then:

env=$1
    if [ ! -f /dirname/${env}hostname ]

стоит упомянуть как более ясный пример использования фигурных скобок

0
29.04.2021, 01:01

Иногда вам приходится использовать ${var}вместо $var, когда вы анализируете данные, введенные пользователем, скажем, на веб-сайте на сервер для выполнения $varне будет работать например

eval('mail("A@bahoo.com","subject","'.$_POST["message"].'",$headers);');

размещенные данные будут работать, если они ${var}не$var

0
20.08.2021, 13:38

Теги

Похожие вопросы