变量值在子shell中丢失

sta*_*ker 3 unix bash scripting

这个bash脚本将jar文件的名称连接到类路径(变量CP),在while循环中值正确但在子shell中丢失,如此相关问题中所描述的Bash变量范围

#!/bin/bash
CP="AAA"
func() {
        ls -1 | while read JAR
        do
                if [ ! -z "$CP" ]; then
                        CP=${CP}':'
                fi
                CP=${CP}${JAR}
        done
        echo $CP # <-- prints AAA
}

func
Run Code Online (Sandbox Code Playgroud)

我的问题是,既然我不知道哪个元素将是最后一个元素,那么如何保存该值.

我是否真的必须将当前值(在循环中重复)保存到文件中?

编辑:

一位同事提出了这个命令序列,效果很好

ls | xargs echo|tr ' ' :
Run Code Online (Sandbox Code Playgroud)

Dae*_*yth 6

这里的问题是while在管道中使用会创建子shell,而子shell不会影响其父级.你可以通过几种方式解决这个问题.对于你现在正在做的事情,这就足够了:

for JAR in *; do
    # Your stuff
done
Run Code Online (Sandbox Code Playgroud)

另外需要注意的是,您不应该依赖解析ls

也向您展示了避免子shell的方法.