for循环中的Bash增量变量

Nob*_*tro 2 bash

我有以下几点:

    #!/bin/bash

    a=0
for d in ./*/ ; do (
cd "$d"
((a++))
echo $a
); done
Run Code Online (Sandbox Code Playgroud)

它进入我路径中的每个目录,递增a并打印a。但是,输出始终为 1。这是为什么呢?

Håk*_*ist 5

来自 bash(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.
Run Code Online (Sandbox Code Playgroud)

通过简单地删除围绕该代码块的括号,您将得到如下内容:
#!/bin/bash

a=0
for d in ./*/
do
    ((a++))
    echo $a
done
Run Code Online (Sandbox Code Playgroud)

(也稍微更传统的格式)

结果是:

1
2
3
4
5
6
7
Run Code Online (Sandbox Code Playgroud)