Поскольку это фактический ответ при работе с кавычками в bash
, я добавлю еще один момент, пропущенный в ответах выше, при работе с арифметическими операторами в оболочке.
Оболочка bash
поддерживает два способа выполнения арифметических операций, один из которых определяется встроенной командой let
и оператором $((..))
. Первое вычисляет арифметическое выражение, в то время как второе является скорее составным выражением.
Важно понимать, что арифметическое выражение, используемое с let
, подвергается разделению слов, расширению пути, как и любые другие команды оболочки. Так что правильное цитирование и экранирование должны быть сделаны.
См. Этот пример при использовании let
let 'foo = 2 + 1'
echo $foo
3
Использование одинарных кавычек здесь абсолютно нормально, так как здесь нет необходимости в расширении переменных, рассмотрим случай
bar=1
let 'foo = $bar + 1'
с треском провалится, так как $bar
в одинарных кавычках не расширится и его нужно будет заключить в двойные кавычки как
let 'foo = '"$bar"' + 1'
Это должно быть одной из причин, $((..))
всегда следует рассматривать как использование let
. Потому что внутри него содержимое не подлежит расщеплению. Предыдущий пример с использованием let
можно просто записать как
(( bar=1, foo = bar + 1 ))
Всегда не забывайте использовать $((..))
без одинарных кавычек
Хотя $((..))
может использоваться с двойными кавычками, для него нет никакой цели, так как в результате не может содержать контент, который будет нуждаться в двойных кавычках. Просто убедитесь, что это не одиночные кавычки.
printf '%d\n' '$((1+1))'
-bash: printf: $((1+1)): invalid number
printf '%d\n' $((1+1))
2
printf '%d\n' "$((1+1))"
2
В некоторых особых случаях использования оператора $((..))
внутри одной строки в кавычках может потребоваться интерполировать кавычки таким образом, чтобы оператор оставался без кавычек или под двойными кавычками. Например. рассмотрим случай, когда вы пытаетесь использовать оператор внутри оператора curl
для передачи счетчика каждый раз при выполнении запроса, выполните
curl http://myurl.com --data-binary '{"requestCounter":'"$((reqcnt++))"'}'
Обратите внимание на использование вложенных двойных кавычек внутри, без которых буквенная строка $((reqcnt++))
передается в поле requestCounter
.