Оценка строки в сценарии оболочки

Я следую этому руководству по созданию сценариев оболочки удара:

В разделе 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

Ожидайте секунда, которая не оценила строку и возвратила количество строки. Это просто повторило строку назад к терминалу. Почему я получал различные результаты?

8
задан 17 March 2014 в 09:54

3 ответа

Необходимо использовать обратные галочки для оценки выражения.

$ 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 ' ' и обратные галочки ´ ´ на командной строке?

2
ответ дан 16 November 2019 в 16:59

Обратите внимание на то, что символ:

'

Одинарная кавычка

   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
5
ответ дан 16 November 2019 в 16:59

Если Вы хотите получить вывод команды в переменной, необходимо или использовать обратные галочки `` или включить команду в $():

$ 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 еще для некоторых деталей того, почему `` должен избежаться.

4
ответ дан 16 November 2019 в 16:59

Другие вопросы по тегам:

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