[解決済み] Bashのwhileループに入力をパイプし、ループ終了後も変数を保持する方法
質問
Bashで使用できる
cat <(echo "$FILECONTENT")
Bashでも使用可能です。
while read i; do echo $i; done </etc/passwd
を組み合わせて使うこともできます。
echo $FILECONTENT | while read i; do echo $i; done
最後のものの問題は、サブシェルが作成され、whileループが終了した後に変数
i
はそれ以上アクセスできないことです。
質問です。
このようなことを実現するにはどうしたらよいでしょうか。
while read i; do echo $i; done <(echo "$FILECONTENT")
または言い換えれば どうすれば
i
がループしていることを確認できますか?
whileステートメントを
{}
で囲むこともできますが、これでは問題が解決しません(関数内で while ループを使って
i
という変数を返したい場合を想像してみてください)。
どのように解決するのですか?
の正しい表記は プロセスの置換 です。
while read i; do echo $i; done < <(echo "$FILECONTENT")
の最後の値は
i
に代入された最後の値は、ループが終了したときに利用可能になります。
代替案としては
echo $FILECONTENT |
{
while read i; do echo $i; done
...do other things using $i here...
}
中括弧はI/Oのグループ化操作であり、それ自体はサブシェルを作成しない。 この文脈では、パイプラインの一部であるため、サブシェルとして実行されますが、その理由は
|
ではなく
{ ... }
. 質問でこのことに触れていますね。 AFAIK、あなたは関数の中でこれらの中からリターンを行うことができます。
Bashはまた
shopt
というビルトインがあり、その多くのオプションのひとつに
lastpipe
設定され、ジョブ制御がアクティブでない場合、シェルは現在のシェル環境でバックグラウンドで実行されていないパイプラインの最後のコマンドを実行します。
したがって、次のようなものを使用します。
をスクリプトで使用することができます。
を使うと、修正された
sum
をループの後に利用できるようにします。
FILECONTENT="12 Name
13 Number
14 Information"
shopt -s lastpipe # Comment this out to see the alternative behaviour
sum=0
echo "$FILECONTENT" |
while read number name; do ((sum+=$number)); done
echo $sum
コマンドラインでこれを行うと、通常、「job control is not active」(つまり、コマンドラインでは、ジョブ制御がアクティブになっている)で反則となります。 スクリプトを使用せずにこれをテストすると、失敗します。
また、指摘されているように Gareth Rees は、彼の 回答 を使用することができます。 の文字列 :
while read i; do echo $i; done <<< "$FILECONTENT"
これには
shopt
を必要としないので、これを使ってプロセスを保存できるかもしれません。
関連
-
[解決済み] Bashで文字列変数を連結する方法
-
[解決済み] Bashで変数で定義された数値の範囲を反復処理するにはどうすればよいですか?
-
[解決済み] Bashで標準出力と標準エラーの両方をファイルにリダイレクトして追記する方法
-
[解決済み] シェルスクリプトでブール変数を宣言して使用するにはどうすればよいですか?
-
[解決済み] 標準出力ではなく標準エラー出力にパイプを通すにはどうしたらいいですか?
-
[解決済み] Do-whileループをエミュレートする方法は?
-
[解決済み] Bashでの単一行whileループの構文
-
[解決済み] シェルスクリプトからエコーを使わずにパスワードを取得する方法
-
[解決済み] Bashでパイプ出力と終了ステータスをキャプチャする
-
[解決済み] 環境変数の指定とエコーを同じコマンドラインで実行できないのはなぜですか?
最新
-
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でファイルを転置する効率的な方法
-
[解決済み] シェルスクリプトでINI値を取得するには?
-
[解決済み] bashを使って関数の出力を変数に代入するにはどうすればよいですか?
-
[解決済み] シェルスクリプトで行末にセミコロンは不要?重複
-
[解決済み] bashで端末の最終行を削除して置換するには?
-
[解決済み] Bashでファイル名を一括変更する
-
[解決済み] Bashでファイルの内容を既存ファイルの末尾に追加する [重複]。
-
[解決済み] ログファイルやコンソールへの出力の書き出し
-
[解決済み] 変数を展開するheredocを回避する方法は?重複