Подтвердить что ты не робот

Backticks против брекетов в Bash

Когда я подошел, чтобы ответить на этот вопрос, я собирался использовать нотацию ${}, так как я видел так много раз здесь, что предпочтительнее обратных ссылок.

Однако, когда я попробовал

joulesFinal=${echo $joules2 \* $cpu | bc}

Я получил сообщение

-bash: ${echo $joules * $cpu | bc}: bad substitution

но

joulesFinal='echo $joules2 \* $cpu | bc'

работает отлично. Итак, какие еще изменения мне нужно сделать?

4b9b3361

Ответ 1

'' Называется Command Substitution и эквивалентно $() (скобки), в то время как вы используете ${} (фигурные скобки).

Таким образом, они равны и означают "интерпретировать команду, размещенную внутри":

joulesFinal='echo $joules2 \* $cpu | bc'
joulesFinal=$(echo $joules2 \* $cpu | bc)
             ^                          ^
       ( instead of {             ) instead of }

Хотя выражения ${} используются для замены переменных.


От man bash:

Подстановка команды позволяет выводить команду на замену имени команды. Существуют две формы:

          $(command)
   or
          'command'

Кроме того, '' сложнее справиться, вы не можете их вложить, например. См. Комментарии ниже и также Почему $ (...) предпочтительнее ... (backticks)? ,

Ответ 2

В конкретном случае они ведут себя несколько иначе:

$ echo "`echo \"test\" `"
test
$ echo "$(echo \"test\" )"
"test"

чтобы обратные ссылки молча удаляли двойные кавычки.