У меня есть следующее:
#!/bin/bash
a=0
for d in ./*/ ; do (
cd "$d"
((a++))
echo $a
); done
Который входит в каждый каталог в моем пути, увеличивает a
и печатает a
. Однако на выходе всегда 1. Это почему?
У меня есть следующее:
#!/bin/bash
a=0
for d in ./*/ ; do (
cd "$d"
((a++))
echo $a
); done
Который входит в каждый каталог в моем пути, увеличивает a
и печатает a
. Однако на выходе всегда 1. Это почему?
Из Баш (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
Потому что вы помещаете тело цикла в ненужные (), что заставляет его выполняться в подоболочке, если я правильно помню.