コマンド置換による空の変数へのデフォルトの割り当て

コマンド置換による空の変数へのデフォルトの割り当て

次の構文を使用しようとしています。

A=${B:-C}

A変数はどこにあり、B割り当てたい値はCBが空のときのデフォルト値です。

Bこれでコマンド置換を使用したいnc -l 443ので、ncポート443を介して文字列をリッスンすると変数に割り当てられ、Aそうでない場合はAデフォルトに設定されます。私は次のようにコマンドを書きます。

A=${`nc -l 443`:-NULL}

しかし、エラーが発生します。

-bash: A=${`nc -l 443`:-NULL}: bad substitution

この目標をどのように達成できますか?

答え1

以下を除いて、最新のBourneに似たシェルでは入れ子になった代替は使用できませんzsh

$ print -rl -- ${$(echo):-C}
C
$ print -rl -- ${$(echo 1):-C}
1

他のシェルでは:

A=$(nc -l 443)
A=${A:-C}

答え2

Bashでは、次の行を使用します。

A=${B:-C}

設定されていて空でない場合は、変数の値をB変数に割り当てます。それ以外の場合、変数は単一文字を含む文字列である値を取得します。ABACC

あなたがしたいこと:

B=$( some command )
A=${B:-C}

その後、空でない場合は出力、空の場合は文字が出力$Aされます。some commandC

答え3

コマンドオーバーライドを使用してbashで変数を設定する場合は、次のようにコマンドが失敗したときにその変数をデフォルト値として指定できます。

uid=$(id -u root || echo NULL)
echo $uid
uid=$(id -u nosuchuser || echo NULL)
echo $uid

逆引用符の構文を好む場合:

uid=`id -u nosuchuser || echo NULL`

stderrを次にリダイレクトしてエラーメッセージを無音に設定できます/dev/null

uid=$(id -u nosuchuser 2>/dev/null || echo NULL)

関連情報