Ctrl-Q
Отключить это в целом, палку stty -ixon
в сценарии запуска. Чтобы позволить любому ключу получать вещи, текущие снова, использовать stty ixany
.
PS: Это ни терминал, ни оболочка, которая делает это, но терминальный драйвер ОС.
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, фигурные скобки являются дополнительными.
${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 оставляет этот случай открытым). Подобие этого случая с простыми присвоениями и рассеянная природа списка случаев, где Вам не нужны двойные кавычки, то, почему я рекомендую просто использовать двойные кавычки, если Вы действительно не хотите разделить и шарик.
IFS
символы, потому что я хочу быть в привычке. Одно исключение, я не заключаю значение в кавычки при делании уроки (если не требуется, такой как тогда, когда значение содержит пространство). Это делает подсветку синтаксиса редактора более полезной, когда существуют замены команды такой как FOO=$(BAR=$(BAZ=blah; printf %s "${BAZ}"); printf %s "${BAR}")
. Вместо того, чтобы окрашивать все в "строковый" цвет, я получаю подсветку синтаксиса вложенного кода. Это также, почему я избегаю обратных галочек.
– Richard Hansen
04.01.2013, 21:19
>$file
в порядке в сценариях POSIX, это не находится в ударе, даже когда неинтерактивная (если соблюдение POSIX не обеспечено с $POSIXLY_CORRECT
или --posix
...).
– Stéphane Chazelas
23.01.2013, 17:01
VAR=$VAR1
, Я иногда удивлялся local VAR=$VAR1
, который я не забываю работать по-другому в некотором отношении по крайней мере в некоторых оболочках. Но банкомат, я не могу воспроизвести расхождение.
– dubiousjim
19.09.2015, 11:31
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 ]
стоит упомянуть как более ясный пример использования фигурных скобок
Иногда вам приходится использовать ${var}
вместо $var
, когда вы анализируете данные, введенные пользователем, скажем, на веб-сайте на сервер для выполнения $var
не будет работать например
eval('mail("A@bahoo.com","subject","'.$_POST["message"].'",$headers);');
размещенные данные будут работать, если они ${var}
не$var
var1=$var
расширение дает ошибку? – alex 16.12.2010, 16:48export VAR=$VAR1
. Что касается фигурных скобок, они являются дополнительными (проверьте четвертый абзац раздела, который Вы процитировали; дело обстоит так во всем предPOSIX и оболочках POSIX). – Gilles 'SO- stop being evil' 16.12.2010, 21:13