无法更新 Bash 脚本中的变量

无法更新 Bash 脚本中的变量

我正在尝试在一行中打印当前文件夹中所有 .txt 文件的名称。我正在使用以下脚本。但是,它没有打印文件名。

REF_SEQ=""
find . -name "*.txt" -maxdepth 1 -type f |
while read f;
do
    name=$(echo ${f}| xargs -I {} basename {} )
    REF_SEQ+="${name} "
done

echo "Full Sequence:  ${REF_SEQ}"

我当前文件夹中有 3-4 个 .txt 文件 (A.txt、B.txt ...)。我期望输出如下

完整序列:A.txt B.txt ...

如果我只是使用find命令而不将输出分配给变量RED_SEQ,我确实会得到所需的输出。这表明 find 命令工作正常,但不知何故我无法将其分配给变量。我尝试了各种不同的赋值运算符,但仍然没有成功。

答案1

要更新中的变量bash,必须使用以下语法:

VAR="some stuff$VAR"

但是,由于您使用管道,while循环是在子 shell 中执行的,因此变量会丢失。

要纠正这个问题,必须使用以下语法:

while read f
do
done <<< $(input)

因此就你的情况而言:

REF_SEQ=""

while read f;
do
    name=$(echo ${f}| xargs -I {} basename {} )
    REF_SEQ="${REF_SEQ}${name} "
done <<< $(find . -name "*.txt" -maxdepth 1 -type f)

echo "Full Sequence:  ${REF_SEQ}"

答案2

问题是,您在管道符号后面使用了 {}。这只在 find 的 -exec 选项中有效,但在管道符号后面无效。

您可以尝试以下操作:

REF_SEQ=$(find . -maxdepth 1 -name "*.txt" -type f -printf "%f " | xargs)

这应该会产生您想要的结果。printf 指令 %f 输出找到的文件的基本名称,xargs “转置”结果。

诚挚问候 Jürgen

相关内容