在bash脚本中,无法更新变量
Tianye
・2 分钟阅读
问题
我正在尝试从一行中打印当前文件夹中所有.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}"
我期望输出为
完整序列: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"转置"输出结果。