1

У меня есть следующее:

    #!/bin/bash

    a=0
for d in ./*/ ; do (
cd "$d"
((a++))
echo $a
); done

Который входит в каждый каталог в моем пути, увеличивает a и печатает a . Однако на выходе всегда 1. Это почему?

2 ответа2

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
1

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .