
存在するLinuxプログラミングを始める本。に関するセクションがあります。文ブロック。このセクションを以下に説明します。
文ブロック
1つのステートメントのみが許可されている複数のステートメントを使用する場合(たとえば、ANDまたはORのリストなど)、中括弧{}で囲んでステートメントブロックを形成できます。たとえば、次のコードを参照してください。
get_confirm && {
grep −v "$cdcatnum" $tracks_file > $temp_file
cat $temp_file > $tracks_file
echo
add_record_tracks
}
ドアブロックのコードがどのように実行されるかを説明してください...
答え1
内部コードは{ ... }
中括弧のないものと同じように実行されます。ただし、今の終了状態に依存しますget_confirm
。
0 終了状態(「成功」)で終了するとget_confirm
ブロックが実行され、それ以外の場合は実行されません。
これはほぼ次のとおりです。
if get_confirm; then
# the contents of the block goes here
fi
(私の意見では良く見えます)。 「ほぼ」は、get_confirm
返された場合、各ステートメントが報告する結果の状態に違いがあるためです。間違った(段落コードは同じ変数を$?
ゼロ以外の値に設定しますが、if
ステートメントは同じ変数をゼロに設定します。)これは、シェルに設定されているオプションと周辺コードの機能によっては重要です。
IMHOの本の例ではありません{ ... }
。
{ echo 'hello world'; date; } >file
単一のリダイレクトを使用して、{ ... }
ブロック内の2つのコマンドの標準出力を同じファイルにリダイレクトします。
これは次のようになります(この場合も同じ効果があります)。
( echo 'hello world'; date ) >file
ただし、その中のステートメントは{ ... }
シェルと同じ環境で実行され、inのステートメントはサブシェル( ... )
(別々の環境)で実行されます。
あなたは違いを見ることができます
{ a=42; }; echo $a
そして
( a=1973 ); echo $a
最初は印刷します42
が、2番目は印刷しません1973
(割り当てはサブシェルで発生し、外部環境には影響しません)。
}
構文に関する注意:ブロックの終わりは改行{ ... }
または後にする必要があります;
。無効で{ echo 'hello' }
、{ echo 'hello'; }
{
echo 'hello'
}
はい。