Linuxプログラミングの開始 本。 ステートメントブロックについてのセクションがあります 。その部分の説明は次のようになります。
ステートメントブロック
ANDリストやORリストなど、1つしか許可されていない場所で複数のステートメントを使用する場合は、
中括弧{}で囲んでステートメントブロックを作成することで、複数のステートメントを使用できます。たとえば、次のコードを参照してください。
get_confirm && {
grep −v "$cdcatnum" $tracks_file > $temp_file
cat $temp_file > $tracks_file
echo
add_record_tracks
}
ステートメントブロックでコードがどのように実行されているかを説明してください…
承認された回答:
{ ... }
内のコード get_confirm
の終了ステータスに依存することを除いて、中括弧なしで実行した場合とまったく同じように実行します。 。
get_confirm
の場合 終了ステータスがゼロ(「成功」)で終了すると、ブロックは実行されます。それ以外の場合は実行されません。
と同等です
if get_confirm; then
# the contents of the block goes here
fi
(見栄えが良いと思います)
この本の例はIMHOであり、{ ... }
の一般的な使用法の良い例ではありません。 。より良い例は
{ echo 'hello world'; date; } >file
これは、単一のリダイレクトを使用して、{ ... }
内の両方のコマンドの標準出力をリダイレクトします。 同じファイルにブロックします。
これは、
に似ています(この場合、同じ効果があります)( echo 'hello world'; date ) >file
ただし、{ ... }
内のステートメント シェルと同じ環境で実行されますが、( ... )
のステートメントは サブシェル(別の環境)で実行されます。
違いがわかります
{ a=42; }; echo $a
および
( a=1973 ); echo $a
1つ目は42
を出力します 一方、2番目は1973
を出力しません (割り当てはサブシェルで行われ、外部の環境に影響を与えることはできません)。
文法についての注意:最後の}
{ ... }
の ブロックは改行または;
の後に続く必要があります 。 { echo 'hello' }
は無効ですが、両方の{ echo 'hello'; }
および
{
echo 'hello'
}
です。