無法更新 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=$(查找 .-maxdepth 1 -name "*.txt" -type f -printf "%f " | xargs)

這應該會產生您想要的結果。 printf 指令 %f 輸出找到的檔案的基名,並且 xargs “轉置”結果。

親切的問候於爾根

相關內容