この種の略語があるかどうか疑問に思います。
現在はできます。
var_empty=; [ -n "$var" ] || var_empty=1; #intermediary variable
echo "REPL_if_var_empty_otherwise_empty=${var_empty:+REPL}"
ブローカーなしで可能ですか?
頑張った
sh -c 'readonly SAME=SAME; var=; echo test0=${var:-SAME} test1=${SAME:+REPL}; echo REPL_if_var_empty_otherwise_empty=${${var:-SAME}:+REPL}'
ただし、これはbad substitution
最後のecho
(test0=SAME test1=REPL
)にエラーを引き起こします。なぜそんなことですか?別の方法がありますか?
答え1
bash、ksh、またはemulationzsh
ではksh
、次のことができます。
r=empty;output=${r[${#var}]}
存在するzsh
:
output=${${var:-empty$var}%$var}
そうでなければいつでもできる
output=;[ "$var" ]||output=empty
答え2
「仲介者なし」とはどういう意味なのかよくわかりません。 「1行にすべて実行」または「変数の割り当ても実行せずにすべての操作を直接実行する」を意味する場合、各方法の説明は次のとおりです。
方法 1a - 変数割り当ての使用:
$ testVar=; [[ "${testVar}" ]] && testVar="" || testVar="was empty"; echo $testVar
方法 1b - 変数割り当ての使用:
testVar=; testVar=$( [ $testVar ] || echo "was empty"); echo $testVar
方法2 - 割り当てなし:
$ testVar=; [[ "${testVar}" ]] && echo "" || echo "was empty"
出力:
was empty
ボーナス:
一般化 - 必要な部分を選択してください。変数はまったくありません。
echo testValue | { echo -n "Original value: "; tee >(read -n 1 && echo "wasn't empty" || echo "was empty"); }
echo testValue
変数の割り当てに使用する元のコマンドで置き換えます。
一般化 - awkの使用:
echo -n | awk 'BEGIN{print "Original value: "}; d=1; END{if (!d) {print "was empty"} else {print "was not empty"} }'
もう一度必要なケースを選択してください(OP質問の場合、生の値は必要ありませんが、おそらくあまり一般的ではありません)。変数で始める必要がある場合は、echo
変数で始めてください。結果を変数に割り当てる必要がある場合は、コマンド置換を使用してください(すべてを$( ... )
。
注:私が知っている限り、sed
これは100%行中心であり、「空のケース」は定義に従って行が0なので、この場合は役に立ちません。したがって、sed
ユーザーが話す内容を処理する前に終了します。また、私はPerlについてよく知らず、それを見つけることができませんでした。 Perlを上手な人なら分かりそうですが。 Bashは{var:=param}
次のように動作します。 OPの場合、特に役に立ちませんが、完全性のために言及します。 OPと同じ理由で、名前付き文字列変数だけでなく生の文字列でも機能したいです(後で必要でない場合は中間体を避けたい)。