次の構文を使用しようとしています。
A=${B:-C}
A
変数はどこにあり、B
割り当てたい値はC
Bが空のときのデフォルト値です。
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
変数に割り当てます。それ以外の場合、変数は単一文字を含む文字列である値を取得します。A
B
A
C
C
あなたがしたいこと:
B=$( some command )
A=${B:-C}
その後、空でない場合は出力、空の場合は文字が出力$A
されます。some command
C
答え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)