Побочные эффекты арифметического выражения Bash не выполнены
$ declare -i i=0
$ for j in {0..2}; do echo "${j} $((i++))"; done
0 0
1 1
2 2
$ for j in {0..2}; do echo "$(echo "${j} $((i++))")"; done
0 3
1 3
2 3
$
Зачем i
не увеличивается во втором цикле for?
(Да, я знаю, что есть обходной путь.)
1 ответ
Решение
Это увеличивается в подоболочке, созданной $(command substitution)
, Когда этот процесс завершается, измененное значение теряется.
Вот похожие способы увидеть тот же эффект:
i=0
bash -c 'let i++' # Subprocess
( let i++ ) # Explicit subshell
let i++ & wait # Backgrounded process
: <( let i++ ) # Process substitution
let i++ | cat # Pipeline
echo "$i" # Still 0