Экранирование кавычек внутри строки в кавычках

Похоже, ваш скрипт не инициализирует переменную energy_efficiency, поэтому первый раз в цикле

echo "scale=9; $energy_efficiency+$val/$iteration_float"

производит

scale=9; +197645.74/1.0

что является синтаксической ошибкой(bcпо-видимому, допускает унарный -, но не унарный+)

$ echo "scale=9; +197645.74/1.0" | bc
(standard_in) 1: syntax error
0
04.03.2021, 06:22
2 ответа

Вот так?

$ var=hello
$ sh -c "curl http://httpbin.org/post -F 'json={\"key\": \"$var\"}'"
{
  "args": {}, 
  "data": "", 
  "files": {}, 
  "form": {
    "json": "{\"key\": \"hello\"}"
  }, 

Аннотированный:

$ sh -c "curl http://httpbin.org/post -F 'json={\"key\": \"$var\"}'"
        1                                2       3    3   34    3 21

(1 )внешние двойные -кавычки, (2 )одинарные -кавычки, не специальные внутри двойных -кавычек, поэтому нет необходимости экранировать, (3 )внутренние двойные -экранированные кавычки для внешних. (4 )раскрытие переменной во внешних двойных -кавычках, перед запускомsh -c(обратите внимание, что одинарные кавычки внутри значения переменной вызовут проблемы для внутренней оболочки, а двойные -кавычки могут испортить Синтаксис JSON ).

Если sh— это Bash, и вы запустите его с помощью -x, вы увидите, что он запускается так:

+ curl http://httpbin.org/post -F 'json={"key": "hello"}'
                                  2      3   3  3     3 2 

, что в значительной степени совпадает с тем, что видит sh -c, и где (2 )— строка в кавычках, а (3 )— не -специальные двойные -кавычки внутри эта строка.

(Я говорю «в Bash», потому что вывод Dash set -xнеоднозначен. А в Bash вообще вывод из -xпеределывает цитирование, т.е. если вы даете команду echo "foo bar", она отображается как echo 'foo bar'. Но в данном конкретном случае это ничего не меняет.)

0
18.03.2021, 22:27

Heredocs делают этот ад цитирования намного более управляемым

sh <<END_SCRIPT
curl http://httpbin.org/post -F 'json={"key": "$VAR"}'
END_SCRIPT

Сам документ здесь не цитируется, поэтому будут заменены переменные.

Если VAR="foo bar", получим

...
  "form": {
    "json": "{\"key\": \"foo bar\"}"
  },
...

Единственное, о чем вам придется беспокоиться, так это о том, содержит ли значение переменной кавычки.

С VAR='She said "Hello"'мы видим этот недопустимый JSON

...
  "form": {
    "json": "{\"key\": \"She said \"Hello\"\"}"
  },
...

Мы можем использовать расширение параметра оболочки, чтобы избежать внутренних кавычек:

sh <<END_SCRIPT
curl http://httpbin.org/post -F 'json={"key": "${VAR//\"/\\\"}"}'
END_SCRIPT

Так что

...
  "form": {
    "json": "{\"key\": \"She said \\\"Hello\\\"\"}"
  },
...
0
18.03.2021, 22:27

Теги

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