コマンドが失敗すると、Bash 'if'ステートメントは早く終了します。

コマンドが失敗すると、Bash 'if'ステートメントは早く終了します。

次のコードは、「if」ステートメントを早期に終了させ、「if」ブロックの「echo」コマンドを実行しないようにします。知りたいなぜこれは「if」ブロックでのみ発生し、スクリプトの主要部分では発生しません。注: ':=' を ':-' に変更すると問題が解決することがわかります。問題を解決するのではなく、問題を引き起こす 'if'ブロックの実行環境間の違いを理解したいと思います。優先的に発生します。

#!/bin/bash

if true; then
        VAR=${$1:='val'}
        echo "This does not run"
fi


VAR=${$1:='val'}
echo "This does run"

出力は次のとおりです

line 4: ${$1:='val'}: bad substitution
line 7: ${$1:='val'}: bad substitution
This does run

繰り返しますが、私はエラーメッセージを置き換えてエラーを修正することに興味がなく、これを行う方法とその理由がわかります。私が理解しようとしているのは、echo "This does not run"上記の「if」ブロックに誤った置換があると、その行が実行されない理由です。

次のbashバージョンに再印刷されました:

GNU bash、バージョン 5.1.16(1)-リリース(x86_64-pc-linux-gnu)

GNU bash、バージョン 4.2.46(2)-リリース(x86_64-redhat-linux-gnu)

ベストアンサー1

Kusalanandaがコメントで指摘したように、これは本質的に説明されているものと同じです。複合コマンドで Bash オプションを設定する

~からバッシュリファレンス:

以下は、コマンドの読み取りと実行時のシェルの操作の簡単な説明です。デフォルトでは、シェルは次のことを行います。

  1. トークンを単純な合計に解析複合コマンド(シェルコマンド参照)

  2. 様々な実行シェル拡張(シェル拡張を参照)拡張トークンをファイル名のリスト(ファイル名拡張を参照)とコマンドと引数で除算します。

  3. ...

  4. 実装するコマンド(コマンドの実行を参照)。

文のブロックはif次のとおりです。複合コマンドそして拡張エラーがあります。つまり、VAR=${$1:='val'}ブロック全体が失敗し、ステップ6に達せず、echo最初のステップは実行されません。

拡張エラーに対するこれらの特別な処理はPOSIX標準に違反していることに注意してください。セクション2.8.1説明する拡張エラーのため、非対話型シェルを終了する必要があります。

POSIXモードでは、Bashは一貫して動作します。

% bash horse 
horse: line 2: ${$1:='val'}: bad substitution
horse: line 4: ${$1:='val'}: bad substitution
This does run
% bash --posix horse 
horse: line 2: ${$1:='val'}: bad substitution

Bashを無罪判決するには、この違反は次のとおりです。録音された:

次のリストは、「POSIXモード」が適用されたときに変更されるものです。

  1. ディレクティブの後にコマンド名がない場合に変数指定エラーが発生すると、非対話式シェルはエラー状態で終了します。

おすすめ記事