bash echo с escape-бэккиком и $ - PullRequest
       60

bash echo с escape-бэккиком и $

0 голосов
/ 27 декабря 2018

test.sh

COMMAND1="Build `date`"
COMMAND2="echo $PATH"

echo "Command1 is: $COMMAND1"
echo "Command2 is: $COMMAND2"

output

Command1 is: Build Wed Dec 26 21:09:43 UTC 2018
Command2 is: echo /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

В приведенном выше сценарии оболочки, как я могу эхо без оценки выраженийто есть я хочу Command1 is: Build `date`

Я понимаю, что могу экранировать символы ` и $, но в моем приложении они исходят из вышестоящего сервиса и передаются в качестве аргумента сценарию оболочки.Даже вышестоящий сервис не может их избежать, потому что позже в скрипте мне действительно нужно выполнить эти команды.

Идеальным способом было бы указать echo только развернуть переменную $COMMAND1, но ничего внутри нее не оценивать.Или используйте sed, чтобы избежать всех вхождений ` и $, но я не смог достичь ни одного.

1 Ответ

0 голосов
/ 27 декабря 2018

Выражение вычисляется при присваивании.

COMMAND1="Build `date`"

`...` означает замену команды (устарела в пользу $( ... )).Кавычки \ "используются для расширения текста. Поэтому сначала эта команда расширяется до:

COMMAND1='Build Wed Dec 26 21:09:43 UTC 2018'

Затем происходит присвоение. Позже вы не сможете получить, какая команда использовалась для объявления переменнойЭта информация потеряна. Если у вас есть какой-то восходящий поток, вам нужно передать эту информацию вам.

Если вы хотите, чтобы COMMAND1 содержала строку (буквально)

Build `date`

Вы можете использовать одинарные кавычки:

COMMAND1='Build `date`'

Позже вы можете использовать некоторую комбинацию eval или аналогичную для расширения переменной, однако я бы предложил просто выполнить функцию

COMMAND1() {
   Build $(date)
}

echo "COMMAND1 is declared as:"
declare -f COMMAND1
echo "COMMAND1 execution returns: $(COMMAND1)"

Полезные ссылки:

...