私はこのwhileループをここのドキュメントと組み合わせてBash 4.3.48(1)で実行していますが、そのロジックをまったく理解していません。
while read file; do source ~/unwe/"$file"
done <<-EOF
x.sh
y.sh
EOF
私の質問は次の部分で構成されています。
ここでやるべきこと
read
(私は常にread
変数を宣言し、値を割り当てるために使用します)。インタラクティブにしかし、ここでやるべきことを見逃しました)。どういう意味ですか
while read
?ここの概念はどこwhile
から来ましたか?文書自体がここに表示される場合後ろにループ、ループはどのような影響を受けますか?私の言葉は、
done
ループ内ではなく後ろに現れますが、これら2つの構造間の実際の接続は何ですか?なぜ失敗したのですか?
while read file; do source ~/unwe/"$file" done <<-EOF x.sh y.sh EOF
私の言うことは、はい...それでは、
done
ループと同じ行にあるのはdone
なぜ重要ですか?私の記憶が正しい場合は、done <<-EOF
ループは1行ですが、まだ機能している状況に遭遇したことがあります。for
答え1
この
read
コマンドは、標準入力ストリームから読み込んで読み取った内容を変数に割り当てますfile
(これよりも少し複雑です.ここで長い議論)。標準入力ストリームはhere-documentで提供され、afterループにリダイレクトされますdone
。データが提供されない場合どこでも、端末から対話的に読みます。ただし、この場合、シェルは入力ストリームをこのドキュメントにリンクするように配置しました。while read
read
コマンドがゼロ以外の終了状態を返すまで、ループが繰り返されます。これは、エラーがある場合、または(最も一般的に)読み取られるデータがない場合(入力ストリームがファイル終了状態の場合)に発生します。通常、呼び出しシェルにエラーまたは「false」または「no」シグナルを送信しようとするすべてのユーティリティは、ゼロ以外の終了ステータスを返してシグナルを送信します。 0 終了ステータスは、「true」、「yes」、または「error no error」を意味します。このステータスを確認しますか?
$?
(最後に実行されたユーティリティでのみ)終了ステータスは、if
ドアwhile
とループ、またはテストが必要な任意の場所で利用できます。例えばif grep -q 'pattern' file; then ...; fi
ここにある文書は次のとおりです。リダイレクトの一形態。この場合、ループにリダイレクトされます。ループ内のすべての内容を読み取ることができますが、この場合はコマンドのみを読み取る
read
ことができます。ここでマニュアルを読んでください。入力が通常のファイルから来る場合、最後の行は次のようになります。done <filename
ループをコマンドとして考えると、より直感的になります。
while ...; do ...; done <filename
これは状況です。
somecommand <filename
一部のシェルは「here-strings」もサポートしています
<<<"string"
。cat <<<"This is the here-string"
David Posterは次のように指摘しています。両方のスクリプトのいずれかがファイルまたは他の場所から読み取るデータを明示的に提供せずに標準入力から読み取る
x.sh
場合、読み取ったデータは実際にはhereドキュメントから来ます。y.sh
x.sh
にのみ含まれる場合、read a
変数a
に文字列が含まy.sh
れ、y.sh
スクリプトは実行されません。これは、標準入力が次のようにリダイレクトされるためです。みんなコマンドをループに追加するとwhile
(呼び出しスクリプトまたはコマンドによって「継承」)、2番目の行はループがx.sh
読み取れる前に「使用」されます。while
read
この動作が望ましくなく防止できる場合しかし、ちょっと面倒です。。
;
前に改行文字がないため失敗しますdone
。前に;
a または改行文字がない場合、done
その単語はdone
引数として扱われ、source
ループも正しく閉じられません (構文エラーです)。すべてを改行で置き換えることができることはほとんど事実です
;
(少なくともコマンド区切り文字の場合)。|
、、、&
および(おそらく忘れた他のものもあります)の&&
よう||
に、コマンドの終わりを表示します。
答え2
デフォルトでは、オブジェクトをドキュメントとして生成してからwhileループにリダイレクトし、残りの行がないまで1行ずつ読み込み、その行でソースコマンドを実行します。
別の方法は次のとおりです。
仮想線
x.sh
y.sh
次のファイルから:
input.txt
我々は実行することができます
cat input.txt | while read file
do source ~/unwe/"$file"
done
ここのドキュメントは作業をよりインタラクティブにしますが、上記の例を見ると、より良いアイデアが得られます。