
Я пытаюсь воспроизвести код изздесь
По какой-то причине это не работает на моем компьютере. Выход, а не числовое значение, это сама команда.
apple$ x='echo "var=500;var%=7;var"|bc'
apple$ $x
"var=500;var%=7;var"|bc
Я хотел бы знать, почему так. Что я сделал не так?
решение1
Источник использует обратные кавычки ( `
) для указания подстановки команды. Команда, указанная в обратных кавычках, выполняется, а результат помещается на ее место. В этом случае это простое присваивание переменной, поэтому результат команды присваивается переменной.
Это легко увидеть с помощью -x
опции bash:
$ x=`echo "var=500;var%=7;var"|bc`
++ echo 'var=500;var%=7;var'
++ bc
+ x=3
Вместо символов обратных кавычек вы использовали одинарные кавычки. Одинарные кавычки указывают оболочке сохранить буквальное значение и не применять к его содержимому никакой обработки. В результате команда назначается переменной как есть. Вот соответствующий вывод -x
:
$ x='echo "var=500;var%=7;var"|bc'
+ x='echo "var=500;var%=7;var"|bc'
Наконец, чтобы распечатать содержимое переменной, следует использовать echo
или printf
. Если значение 'x' равно 3, выполнение $x
выдаст вам -bash: 3: command not found
сообщение об ошибке. Выполнение $x
сработало в вашем случае только потому, что echo
команда была частью содержимого переменной.
решение2
Как заметил Хаксиел, вместо символов обратных кавычек вы, скорее всего, использовали одинарные кавычки. Но лучше, чем использовать обратные кавычки ( `
), я предлагаю вам использовать $()
. Обратные кавычки устарели и $()
совместимы с POSIX.
В вашем примере вы могли бы сделать:
x=$(echo "var=500;var%=7;var" | bc)
echo "$x"
Или в одной строке:
echo "var=500;var%=7;var" | bc