シェル条件&&、||後ろにいくつかのコマンドがリストされます。シェルスクリプト、ダッシュ

シェル条件&&、||後ろにいくつかのコマンドがリストされます。シェルスクリプト、ダッシュ

次の条件の後に複数のコマンドを実行しようとします。

[ $VAR ] || echo "Error msg" ; echo "exit"

そして駅

[ -z $VAR ] &&  echo "Error msg" ; echo "exit"

期待どおりに動作しないことを知っています。実際に以前に行う方法を知っていましたが、実行する方法を忘れていました。私はif'を使用したり、()andを介して束ねるなど、多くの選択肢を完全に知っています{}。を使用すると、()実行中のスクリプトを終了しない子プロセスが生成されます。使用すると{}動作しますが、より読みやすい代替手段が存在することを知っています。

私はこれを使って:完璧です!今は全く覚えておらず、私が書いた台本も失ってしまいました。

この記事をどのように書くかを知っている人なら、助けてくれたら:本当に感謝します!

答え1

より読みやすい選択肢は次のとおりです。

if [ -z "$VAR" ]; then
  echo "Error msg" 1>&2
  exit 1
fi

私はそれがあなたが探しているものではないことを知っています。しかし、これは書くべきです。ここで&&and の使用は||少し神秘的です。私はあなたが何を覚えているのか(または間違って覚えているのか)はわかりませんが、それが何であれ、誰もそれが何であるかを推測できない場合は、確かに「読める」資格はありません。

ところで、周辺の引用を参照してください$VAR変数の置換には常に二重引用符を使用してください。、引用符を省略しなければならない理由と、そうすることが安全な理由を知らない場合。 (中に引用符を入れる必要はありませんが[[ … ]]、中には引用符を入れる必要があります[ … ]。)

evalコマンドをグループ化する狡猾な方法ですが、使用するのは簡単ではありません。

別のコマンドから出力を生成するもう1つの方法は、コマンド置換で実行することです。今回も読めません。

[ "$VAR" ] || exit 1$(echo "error message" >&2)

特定の形式のグループ化構成(中括弧または//または/ if/thenfiwhiledodone

答え2

私は非常に読みやすい次のようなものを使用する傾向があります。

[ -z "$VAR" ] && {
  echo "Line $LINENO: Error msg"
  exit 1
} >&2

の場合、:私が想像できる唯一のことは何らかの方法で関数を定義することですが、これを複数のコマンドを実行できるブロックに変換する方法がわかりません。

~からman bash:

: [arguments]
        No effect; the command does nothing beyond expanding arguments and
        performing any specified redirections. A zero exit code is returned.

:だから私はそれを別のものに上書きすることが唯一の可能性だと思います。私はこれが何であるか知りたいです。

とにかく、引用符なしでこれらのパラメータを拡張することは意味がありません。特に、[ -zif[ -z $VAR ]が空の場合(またはデフォルトの空白、タブ、および改行のみを含む場合)[ -z ]$VAR$IFS[ -z 空の文字列 ]はの省略形であるためtrueを返します[ -n "-z" ]

また、$LINENO終了コードを使用するのは悪い考えです。 0から255までの数字のみがサポートされ(他のシェルはその範囲外の値に対して異なる動作をします)、一部は特別な意味を持つためです。

答え3

いくつかのオプションのどれも実際には適していません

  1. ${VAR:?"Error msg"}
  2. eval "${VAR:-echo Error msg; exit}"
  3. 算術評価は三項式をサポートしますが、値に対してのみサポートされます。これがあなたのユースケースにどのように役立つかわかりません。unset -v a; (( VAR != 0 ? (a=20) : (a=3) )) ; echo $a

答え4

私はあなたが実際にあなたが言ったことを探しているとは思わないかもしれません。そうではありませんか?

[[ -z "$temp" ]] && { echo nope; continue; }

関連情報