Переменная инкремента Bash в цикле for
У меня есть следующее:
#!/bin/bash
a=0
for d in ./*/ ; do (
cd "$d"
((a++))
echo $a
); done
Который идет в каждый каталог на моем пути, приращения a
и печатает a
, Тем не менее, выход всегда равен 1. Почему это?
2 ответа
Решение
Из Баш (1):
(list) list is executed in a subshell environment (see COMMAND EXECU‐ TION ENVIRONMENT below). Variable assignments and builtin com‐ mands that affect the shell's environment do not remain in effect after the command completes. The return status is the exit status of list.
Просто удалив скобки вокруг этого блока кода, вы получите что-то вроде этого:
#!/bin/bash
a=0
for d in `seq 1 7`
do
((a++))
echo $a
done
(также немного более условно отформатированный)
результат:
1
2
3
4
5
6
7
Потому что вы помещаете тело цикла в ненужные (), что заставляет его выполняться в подоболочке, если я правильно помню.