web-dev-qa-db-ja.com

ステートメントはシェルスクリプトのメカニズムをブロックしますか?

Linuxプログラミングの始まり本。 ステートメントブロックに関するセクションがあります。その部分では、説明は次のようになります。

ステートメントブロック

ANDまたはORリストのように、1つだけが許可されている場所で複数のステートメントを使用する場合は、ステートメントを中括弧{}で囲んでステートメントブロックを作成することで使用できます。 。たとえば、次のコードを参照してください。

get_confirm && {
    grep −v "$cdcatnum" $tracks_file > $temp_file 
    cat $temp_file > $tracks_file
    echo
    add_record_tracks
}

ステートメントブロックでのコードの実行方法を説明してください...

7
alamin

{ ... }内のコードは、中かっこなしで実行した場合とまったく同じように実行されますが、get_confirmの終了ステータスに依存します。

get_confirmがゼロの終了ステータス( "成功")で終了する場合、ブロックは実行されます。それ以外の場合は実行されません。

それは同等です

if get_confirm; then
    # the contents of the block goes here
fi

(見た目が良いと思います)

この本の例は私見であり、{ ... }の一般的な使用の良い例ではありません。より良い例は

{ echo 'hello world'; date; } >file

これは、単一のリダイレクトを使用して、{ ... }ブロック内の両方のコマンドの標準出力を同じファイルにリダイレクトします。

これは似ています(この例では、同じ効果があります)

( echo 'hello world'; date ) >file

ただし、{ ... }内のステートメントはシェルと同じ環境で実行されますが、( ... )内のステートメントはサブシェル(別の環境)で実行されます。

あなたは違いを見ることができます

{ a=42; }; echo $a

そして

( a=1973 ); echo $a

前者は42を出力しますが、後者は1973を出力しません(割り当てはサブシェルで行われ、外部の環境に影響を与えることはできません)。

文法に関する注意:}ブロックの終了{ ... }は、改行または;の後に続く必要があります。 { echo 'hello' }は無効ですが、{ echo 'hello'; }

{ 
    echo 'hello'
}

あります。

10
Kusalananda