Похоже, ваш скрипт не инициализирует переменную 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
Вот так?
$ 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'
. Но в данном конкретном случае это ничего не меняет.)
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\\\"\"}"
},
...