Я следую этому руководству по написанию скриптов в bash:
В разделе Числовые сравнения он приводит пример:
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
То, что происходит выше, это то, что мы храним строку команд в переменной bash, а затем вызываем echo для этой переменной. Кажется, что происходит, когда строка вычисляется и команда wc выполняется и возвращает количество строк в управляющий терминал.
Итак, я запускаю свой терминал в 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
Подождите секунду, это не оценило строку и вернуло количество строк. Это просто повторило строку обратно в терминал. Почему я получил разные результаты?
command-line
bash
scripts
JohnMerlino
источник
источник
wc -l work.txt
, вместо этого ей присваивается номер 201.Ответы:
Вы должны использовать обратные пометки, чтобы оценить выражение.
Если вы хотите видеть только «1» в выводе, используйте команду
А также работает:
Для получения дополнительной информации см. Различия между двойными кавычками "", одинарными кавычками '' и обратными кавычками ´ ´ в командной строке?
источник
wc
работает команда. Попробуйcat sample.txt | wc -l
.Пожалуйста, обратите внимание, что символ:
Одинарные цитаты
а также
кавычка
Таким образом, Backquote возвращает результат команды в стандартный вывод. Поэтому
возвращает результаты команды, а
просто верните "wc -l sample.txt" как обычную строку
Рассмотрим это в качестве примера:
А теперь повторить все три переменные:
источник
Если вы хотите записать вывод команды в переменную, вам нужно либо использовать обратные пометки,
``
либо заключить команду в$()
:Обратите внимание, что строка на самом деле вычисляется в момент объявления переменной, а не когда вы ее выводите. Команда на самом деле выполняется в пределах
$()
или кавычек, и выходные данные этой команды сохраняются как значение переменной.В общем, вы должны всегда использовать
$()
вместо обратных ссылок, которые устарели и только вокруг по причинам совместимости и гораздо более ограниченным. Вы не можете, например, вкладывать команды в обратные трюки, но вы можете сделать это с помощью$()
:Посмотрите эту ветку на U & L для более подробной информации о том, почему
``
следует избегать.источник
$(
)
чтобы`
`
. Но, как говорит шутник, обратные кавычки действительно гнездятся.echo $(date -d $(echo yesterday))
становитсяecho `date -d \`echo yesterday\``
;echo $(echo $(date -d $(echo yesterday)))
становитсяecho `echo \`date -d \\\`echo yesterday\\\`\``
. Я говорю, что это не опровергает ваш тезис, а укрепляет его : экранированные внутренние обратные кавычки делают`
`
синтаксис более мощным, чем часто допускается, но особая трактовка\
странного, удивительного и трудного рассуждать. С того,$(
)
что вы видите, как правило , то , что вы получите.