bash スクリプトで変数を更新できません

bash スクリプトで変数を更新できません

現在のフォルダーにあるすべての .txt ファイルの名前を 1 行に印刷しようとしています。次のスクリプトを使用しています。ただし、ファイル名は印刷されません。

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ループはサブシェルで実行され、変数は失われます。

これを修正するには、次の構文が必要です。

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 は結果を「転置」します。

よろしくお願いいたします ユルゲン

関連情報