Я следую этому руководству по созданию сценариев оболочки удара:
В разделе Numeric Comparisons это приводит пример:
anny > num=`wc -l work.txt`
anny > echo $num
201
anny > if [ "$num" -gt "150" ]
More input> then echo ; echo "you've worked hard enough for today."
More input> echo ; fi
То, что, кажется, происходит выше, мы храним строку команд в переменной удара, и затем мы вызываем эхо на переменную. То, что, кажется, происходит, является строкой, оценен, и команда туалета выполняется и возвращает количество строки терминалу управления.
Хорошо, таким образом, я запускаю свой терминал в Ubuntu 12.04 и пробую что-то подобное:
$ touch sample.txt && echo "Hello World" > sample.txt
$ cat sample.txt
Hello World
$ num='wc -l sample.txt'
echo $num
wc -l sample.txt
Ожидайте секунда, которая не оценила строку и возвратила количество строки. Это просто повторило строку назад к терминалу. Почему я получал различные результаты?
Необходимо использовать обратные галочки для оценки выражения.
$ num=`wc -l sample.txt`
$ echo $num
1 sample.txt
, Если Вы хотите видеть "только 1" в выводе, используйте команду
$ num=`cat sample.txt | wc -l`
$ echo $num
1
, И также работает:
$ num=`wc -l < sample.txt`
$ echo $num
1
Для получения дополнительной информации, см. Различия между doublequotes " " singlequotes ' ' и обратные галочки ´ ´ на командной строке?
Обратите внимание на то, что символ:
'
Одинарная кавычка
Enclosing characters in single quotes preserves the literal value of
each character within the quotes. A single quote may not occur between
single quotes, even when preceded by a backslash.
и
'
Одинарная левая кавычка
Command substitution allows the output of a command to replace the com‐
mand name. There are two forms:
$(command)
or
`command`
Bash performs the expansion by executing command and replacing the com‐
mand substitution with the standard output of the command, with any
trailing newlines deleted.
, Таким образом, Одинарная левая кавычка возвращает результат команды к Стандартному выводу. Именно поэтому
`wc -l sample.txt`
результаты возвратов команды, в то время как
'туалет-l sample.txt'
просто возврат "туалет-l sample.txt" как обычная строка
Рассматривают выполнение этого как пример:
$ A='wc -l /proc/mounts'
$ B=`wc -l /proc/mounts`
$ C=$(wc -l /proc/mounts)
И теперь повторяют все три переменные:
$ echo $A
wc -l /proc/mounts
$ echo $B
35 /proc/mounts
$ echo $C
35 /proc/mounts
Если Вы хотите получить вывод команды в переменной, необходимо или использовать обратные галочки ``
или включить команду в $()
:
$ d=$(date)
$ echo "$d"
Mon Mar 17 10:22:25 CET 2014
$ d=`date`
$ echo "$d"
Mon Mar 17 10:22:25 CET 2014
Примечание, что строка на самом деле оценена во время объявления переменной, не при повторении его. Команда на самом деле выполняется в $()
или обратные галочки, и вывод той команды сохраняется как значение переменной.
В целом, необходимо всегда использовать $()
вместо обратных галочек, которые удерживаются от использования и только вокруг по причинам совместимости и намного более ограниченные. Вы не можете, например, вложить команды в обратных галочках, но Вы можете с $()
:
$ echo $(date -d $(echo yesterday))
Sun Mar 16 10:26:07 CET 2014
См. этот поток на U& L еще для некоторых деталей того, почему ``
должен избежаться.