Переменная инкремента 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

Потому что вы помещаете тело цикла в ненужные (), что заставляет его выполняться в подоболочке, если я правильно помню.

Другие вопросы по тегам