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

Это моя вина. В моем файле ~ / .profile был [[some_test]], и он хорошо работает в bash, но я думаю, что тире выполняется несколько команд pre_session_creation / post_session_creation при запуске сеанса и тире не знаю [[keyword. Итак, все было загружено, но остановилось при ошибке.

1
задан 17 March 2014 в 11:54

2 ответа

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

'

Одиночная цитата

   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.

и

' [!d2 ]

`

   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.

Backquote

`wc -l sample.txt`

Итак, Backquote возвращает результат команды на стандартный вывод. Вот почему

'wc -l sample.txt'

возвращает результаты команды, а

просто возвращает «wc -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
ответ дан 24 May 2018 в 10:43

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

$ d=$(date)
$ echo "$d"
Mon Mar 17 10:22:25 CET 2014
$ d=`date`
$ echo "$d"
Mon Mar 17 10:22:25 CET 2014

Обратите внимание, что строка фактически оценивается в момент объявления переменной, а не когда вы ее эхо. Команда действительно выполняется внутри $() или обратных циклов, а выход этой команды сохраняется как значение переменной.

В общем, вы всегда должны использовать $() вместо обратных выходов, которые устарели и только вокруг по соображениям совместимости и гораздо более ограниченным. Вы не можете, например, вставлять команды в backticks, но вы можете с помощью $():

$ echo $(date -d $(echo yesterday))
Sun Mar 16 10:26:07 CET 2014

См. Эту тему в U & amp; L для более подробной информации о том, почему `` следует избегать. 3]

3
ответ дан 24 May 2018 в 10:43
  • 1
    Я согласен, что сценарии должны предпочесть $( ) в ` `. Но поскольку wag говорит , backquotes делают гнездо. echo $(date -d $(echo yesterday)) становится echo `date -d \`echo yesterday\``; echo $(echo $(date -d $(echo yesterday))) становится echo `echo \`date -d \\\`echo yesterday\\\`\``. Я говорю, что это не опровергает ваш тезис , а усиливает его : экранированные внутренние обратные кавычки делают синтаксис ` ` более мощным, чем часто допускаются, но особое отношение к \ странно, удивительно и сложно рассуждать. С помощью $( ) то, что вы видите, обычно то, что вы получаете. – Eliah Kagan 22 January 2017 в 06:20

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

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