web-dev-qa-db-ja.com

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}"

現在のフォルダー(A.txt、B.txt ...)に3〜4個の.txtファイルがあります。私は出力を期待しています

完全なシーケンス:A.txt B.txt ...

変数RED_SEQに出力を割り当てずにfindコマンドを使用するだけで、目的の出力が得られます。これは、findコマンドが正常に機能していることを示唆していますが、どういうわけかそれを変数に割り当てることができません。さまざまな代入演算子を試しましたが、まだうまくいきませんでした。

2
UserOnWeb

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}"
1
Mathieu

問題は、パイプ記号の後ろに{}を使用することです。これは、findの-execオプションでのみ有効ですが、パイプ記号の後ろでは有効ではありません。

以下を試すことができます:

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

これにより、希望どおりの結果が得られます。 printf-directive%fは、見つかったファイルのベース名を出力し、xargsは結果を「転置」します。

ユルゲンよろしく

0
jottbe