GNU/Linux >> Linux の 問題 >  >> Linux

シェルスクリプトのステートメントブロックメカニズム?

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'
}

です。


Linux
  1. Linuxでシェルスクリプトを使用してJsonを解析する方法は?

  2. AptまたはApt-getInShell Scriptingを使用する必要がありますか?

  3. Linux シェル スクリプトでのバックティック (`) 記号

  1. ファイル記述子とシェルスクリプト?

  2. シェルスクリプトでの検索と置換

  3. シェルスクリプトでの使用法()とは何ですか?

  1. シェルスクリプトで最も価値の高いコンテンツを表示しますか?

  2. Bashシェルスクリプトで文字列を比較する方法

  3. Linux シェル スクリプト:16 進数からバイナリ文字列へ