[解決済み】whileループの中で変更された変数が記憶されない
2022-04-03 01:17:26
質問
以下のプログラムにおいて、変数
$foo
の内部で値 1 を設定します。
if
を実行すると、if文の後でその値が記憶されるという意味で動作します。しかし、同じ変数に2という値を設定すると
if
の中にある
while
文の後では忘れ去られます。
while
のループになります。まるで変数のコピーを使っているような挙動です。
$foo
の中で
while
のループで、その特定のコピーだけを変更しています。以下は完全なテストプログラムです。
#!/bin/bash
set -e
set -u
foo=0
bar="hello"
if [[ "$bar" == "hello" ]]
then
foo=1
echo "Setting \$foo to 1: $foo"
fi
echo "Variable \$foo after if statement: $foo"
lines="first line\nsecond line\nthird line"
echo -e $lines | while read line
do
if [[ "$line" == "second line" ]]
then
foo=2
echo "Variable \$foo updated to $foo inside if inside while loop"
fi
echo "Value of \$foo in while loop body: $foo"
done
echo "Variable \$foo after while loop: $foo"
# Output:
# $ ./testbash.sh
# Setting $foo to 1: 1
# Variable $foo after if statement: 1
# Value of $foo in while loop body: 1
# Variable $foo updated to 2 inside if inside while loop
# Value of $foo in while loop body: 2
# Value of $foo in while loop body: 2
# Variable $foo after while loop: 1
# bash --version
# GNU bash, version 4.1.10(4)-release (i686-pc-cygwin)
解決方法は?
echo -e $lines | while read line
...
done
は
while
ループはサブシェルで実行されます。そのため、変数に対して行った変更は、サブシェルが終了すると利用できなくなります。
その代わりに
この文字列
を使用して、while ループがシェルのメインプロセス内にあるように書き換えてください。
echo -e $lines
はサブシェルで実行されます。
while read line
do
if [[ "$line" == "second line" ]]
then
foo=2
echo "Variable \$foo updated to $foo inside if inside while loop"
fi
echo "Value of \$foo in while loop body: $foo"
done <<< "$(echo -e "$lines")"
を削除することができます。
echo
を代入する際に、バックスラッシュを即座に展開することで、上記のHere-Stringの中で
lines
. その
$'...'
の形式が使用できます。
lines=$'first line\nsecond line\nthird line'
while read line; do
...
done <<< "$lines"
関連
-
[解決済み] シンプルなAsciiテーブルをCSVに変換する【終了】。
-
[解決済み] 絶対パスと論理パスの違い
-
[解決済み] "[0: コマンドが見つかりません]" in Bash [重複].
-
[解決済み] AWS CLIのプロファイルを一時的に切り替えるには?
-
[解決済み] Bashスクリプトのset -o pipefailの意味を教えてください。
-
[解決済み] Do-whileループをエミュレートする方法は?
-
[解決済み] Bashでの単一行whileループの構文
-
[解決済み] Bashの変数代入でCommand not foundエラーが発生する
-
[解決済み] Bashでコマンドの前に環境変数を設定すると、パイプ内の2番目のコマンドで動作しない
-
[解決済み】Pythonのforループのスコープについて
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】 -bash: 予期しないトークン「改行」付近での構文エラー
-
[解決済み] bash : cd : 引数が多すぎる [閉店].
-
[解決済み] find -exec cp {} でエラー 'find: missing argument to -exec' が発生した場合の解決策。TARGET_DIR + [閉店]。
-
[解決済み] /bin/sh: apt-get: 見つかりません。
-
[解決済み] bashの文字列の等値性テストで、予期しない演算子エラーが発生するのはなぜですか?重複
-
[解決済み] curl: 引数リストが長すぎる
-
[解決済み] mkdir コマンドが bash スクリプトで見つかりません。
-
[解決済み] あいまいなリダイレクト」エラーが発生する
-
[解決済み] パイプと二重パイプのどちらの OR 演算子を使うか?
-
[解決済み] bashスクリプトで変数の束縛を解除