私はbashスクリプトを書いています。
すべてこのオリジナル投稿varが設定されていないか空の場合、c=${a:-b}
変数を設定するためにこの方法を使用できることを学びました。c
a
この状況を拡張して、コマンドの出力を変数に割り当てることができるかどうか疑問に思います。たとえば、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
設定されます(何かを出力するかどうかにかかわらず)。default
cmd
cmd
出力が空ではなく、改行のみが含まれている場合、コマンドは通常バーが空ですvar=$(cmd)
。$var
みんな末尾の改行文字。bash
また、すべてのNUL文字を削除します。zsh
それらを残すと、他のシェルは最初のNUL文字以降のすべてを削除します。yash
ロケールで有効な文字のバイトシーケンスを形成できない場合はブロックされます。
$var
GNU(または非テキスト入力を処理でき、(非修正)処理可能で区切られていない行を無視しない実装)を使用して出力が空でない場合にのみに設定するにはあります。default
cmd
grep
var=$(cmd | grep '^') || var=default
grep '^'
whereが入力の少なくとも行の先頭を見つけた場合(そして入力全体を中断せずに出力に渡す場合)、trueを返します。
この場合、cmd
終了状態は失われます。 NULまたは改行文字のみを出力すると、$var
何も出力されないことがあります。cmd