在bash脚本中,无法更新变量

・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"转置"输出结果。


Tianye profile image