Побочные эффекты арифметического выражения 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
Другие вопросы по тегам