Bash 在 for 循环中增加变量

Bash 在 for 循环中增加变量

我有以下内容:

    #!/bin/bash

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

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

答案1

从 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.

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

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

(格式也稍微更传统一些)

结果是:

1
2
3
4
5
6
7

答案2

因为您将循环体放在了不必要的 () 中,如果我没记错的话,这会使其在子 shell 中执行。

相关内容