Bashで変数の割り当てに "${a:-b}"を使用し、 "a"コマンドを使用できますか?

Bashで変数の割り当てに "${a:-b}"を使用し、 "a"コマンドを使用できますか?

私はbashスクリプトを書いています。

すべてこのオリジナル投稿varが設定されていないか空の場合、c=${a:-b}変数を設定するためにこの方法を使用できることを学びました。ca

この状況を拡張して、コマンドの出力を変数に割り当てることができるかどうか疑問に思います。たとえば、bashコマンドがあり、some commandそれをvarに割り当てることができます。c

c=$(some command)

some commandただし、cの出力が空の場合、cに別のデフォルト値を割り当てる場合も含めたいと思います。

Bashスクリプトで一般的なコードを書くことができることを知っていますが、if-elseもっとエレガントな同様の方法があるかどうか疑問に思いますc=${a:-b}

答え1

zshでは、次のことができます。

var=${$(cmd):-default}

ただし、bashを含むすべてのPOSIX様シェルでは、いつでも次のことができます。

var=$(cmd)
var=${var:-default}

または

: "${var:=default}"

終了ステータスは失われますが、ステップ間で変数に保存できます。

var=$(cmd)
exit_status=$?
: "${var:=default}"

次のこともできます。

var=$(cmd) exit_status=$? || var=default

Forが失敗した場合に$var設定されます(何かを出力するかどうかにかかわらず)。defaultcmd

cmd出力が空ではなく、改行のみが含まれている場合、コマンドは通常バーが空ですvar=$(cmd)$varみんな末尾の改行文字。bashまた、すべてのNUL文字を削除します。zshそれらを残すと、他のシェルは最初のNUL文字以降のすべてを削除します。yashロケールで有効な文字のバイトシーケンスを形成できない場合はブロックされます。

$varGNU(または非テキスト入力を処理でき、(非修正)処理可能で区切られていない行を無視しない実装)を使用して出力が空でない場合にのみに設定するにはあります。defaultcmdgrep

var=$(cmd | grep '^') || var=default

grep '^'whereが入力の少なくとも行の先頭を見つけた場合(そして入力全体を中断せずに出力に渡す場合)、trueを返します。

この場合、cmd終了状態は失われます。 NULまたは改行文字のみを出力すると、$var何も出力されないことがあります。cmd

関連情報