我有以下内容:
#!/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 中执行。