3

だからここに私のスクリプトがあります:

count=0
cat myfile | while read line
do
    #some stuff...
    let count++
    echo $count
done
echo $count

最後の echo ステートメントは、ファイル内の行数ではなく 0 を出力しますが、while ループの echo ステートメントは増分値を出力します。

問題は配管にあります。単純な while ループでは、最後の echo ステートメントが正しい値を出力するからです。どうすればこれを機能させることができますか?

4

2 に答える 2

4

Bash では、プロセス置換を使用して一時ファイルを回避でき、whileループ内の変数が保持されます。

count=0
while read -r line  # you should almost always use -r
do
    #some stuff...
    (( count++ ))   # alternative form 
    echo $count
done < <(tac myfile)
echo $count
于 2010-11-21T10:49:36.837 に答える
2

パイプを使用すると、新しいサブシェルが作成され、その中の変数はその後失われます。代わりに次のコードを使用してください。

count=0
while read line
do
    #some stuff...
    let count++
    echo $count
done < myfile
echo $count

コマンドの例: tac:

count=0
# Create a random file
tmpfile=$(mktemp)
tac myfile > $tmpfile
while read line
do
    #some stuff...
    let count++
    echo $count
done < $tmpfile
# remove temp file
rm $tmpfile
echo $count
于 2010-11-21T08:58:17.703 に答える