Использование printf% q, чтобы сделать строку в кавычках пригодной для ввода в сценарий оболочки - PullRequest
1 голос
/ 06 мая 2019

В скрипте bash я пытаюсь добавить в файл командную строку, состоящую из одинарных и двойных кавычек (.profile).

Я хотел бы использовать echo, а затем >>команда на .profile.Конечно, я открыт для любого решения, которое работает.

Я бы хотел использовать команду echo "curl -X POST -H "Content-Type: application/json" -d '{"value1":"PHONENUMBER","value2":"MESSAGE"}' https://maker.ifttt.com/trigger/TRIGGER/with/key/KEY &> /dev/null" >> .profile, но, очевидно, это не работает в моем bash-скрипте.

Я не являюсьясно, как работает printf %q, и не понимаю, как применить его к моей проблеме.

Я пробовал это

`CMDSTRING='curl -X POST -H "Content-Type: application/json" -d '`
`CMDSTRING=${CMDSTRING}"'"`
`CMDSTRING=${CMDSTRING}'{"value1":"+PHONENUMBER","value2":"MESSAGE"}'`
`CMDSTRING=${CMDSTRING}"'"`
`CMDSTRING=${CMDSTRING}' https://maker.ifttt.com/trigger/TRIGGER/with/key/KEY &> /dev/null'`

`echo $CMDSTRING`

1 Ответ

2 голосов
/ 06 мая 2019

Использование printf '%q' для генерации .profile контента выглядит примерно так:

{
  printf '%q ' \
    curl -X POST -H "Content-Type: application/json" \
      -d '{"value1":"PHONENUMBER","value2":"MESSAGE"}' \
      https://maker.ifttt.com/trigger/TRIGGER/with/key/KEY
  printf '%s\n' "&>/dev/null" 
} >> .profile

Обратите внимание, что вы не можете использовать строку формата %q, если хотите &>/dev/null для синтаксического анализа, поскольку по самой своей природе он форматирует все передаваемые данные для анализа в качестве данных.

Таким образом, мы используем printf '%q ' "command name" "first argument" ... для самой команды и форматируем перенаправление внеband.


Тем не менее, обратите внимание, что значение выше, только если вы подставляете переменные из ненадежного источника (вместо того, чтобы жестко их кодировать, как в примере), ибеспокоятся о том, что недопустимые значения могут быть использованы для внедрения команд.Если вы действительно просто добавляете постоянную строку в конец файла, заключенный в кавычки heredoc позволит вам создать более естественный вид цитирования оболочки вручную (на самом деле, как вы уже сделали!) И передать его дословно:

cat >>.profile <<'EOF'
curl -X POST -H "Content-Type: application/json" \
  -d '{"value1":"PHONENUMBER","value2":"MESSAGE"}' \
  https://maker.ifttt.com/trigger/TRIGGER/with/key/KEY &> /dev/null
EOF

Здесь все между <<'EOF' и EOF передается точно так же, как задано, , включая кавычки и расширения параметров, которые в противном случае оболочка может попытаться интерпретировать.

...