"while"ループの外側で、readステートメントの最後の変数割り当てを維持します。

$f1以下のようなループの外で変数、、...をエコーし​​ようとしています。私が理解したのは、変数の範囲が正しくありません。そこで、図のようにいくつかの解決策を試しました。$f2whileバッシュFAQで:

while IFS=: read -r f1 f2 f3 f4 f5 f6 f7; do
  echo "Username: $f1. Home directory:$f6"
done</etc/passwd

echo $f1

ただし、リンクに表示されている修正を再現できないようです。誰かがこの問題を解決する方法のアプリケーションケースを提供できますか?

ベストアンサー1

リンクで外部で使用される変数(linecount)は、「ループ」変数として定義されていません。これはメインループ内でのみ変更(増分)され、「while」ステートメント内では変更(増分)されません。

「read -r f1 f2...」部分を呼び出すと、使用済み変数のリセット(準備)(f1 ..f7)、入力ラインを待ち、入力に応じて変数を割り当てます。ファイルの末尾から入力行(EOFまたはパイプエラー)を取得できず、falseを返し、ループを終了します。しかし、変数がリセットされました。

set -xステートメントの前に追加して「デバッグモード」を有効にして直接計算できますwhile

これにより、次のような結果が生成されます。

++ IFS=:
++ read -r f1 f2 f3 f4 f5 f6 f7
++ echo 'Username: bind. Home directory:/var/cache/bind'
Username: bind. Home directory:/var/cache/bind
++ IFS=:
++ read -r f1 f2 f3 f4 f5 f6 f7
++ echo

最後の読み取りが呼び出され、最後の「echo $ f1」が呼び出されるのがわかります。

したがって、リンクに指定されているように別の記憶変数を作成する前に値を割り当ててから使用できます。

typeset f0=""
while IFS=: read -r f1 f2 f3 f4 f5 f6 f7; do
  echo "Username: $f1. Home directory:$f6"
  f0="$f1"
done</etc/passwd
echo $f0

おすすめ記事