ループ後、bashスクリプトvarは変更されませんでした。

ループ後、bashスクリプトvarは変更されませんでした。

私はbashスクリプトに初めてアクセスし、wc -cコマンドをシミュレートするために次のスクリプトを作成しました。 (行末を計算しないことを知っています。)

#!/bin/bash

echo $1
len=0
cat $1 | while read line
do
    let len+=${#line}
    echo $len
done
echo $len

出力は次のとおりです。

xyz.sh
11
11
18
27
51
53
70
79
83
92
0

len何度も何度も試しても変更が持続しないのはなぜですか?

ベストアンサー1

これはwhile、ループがサブシェルで実行されるために発生します。子シェルの変数の変更は親シェルには影響しません。

catいくつかのリダイレクトを実行して、パイプや不必要な使用を避けてください。

while read line
do
    let len+=${#line}
    echo $len
done < $1

これはサブシェルを必要としないため、変更は$len親シェルに表示されます。

おすすめ記事