文字列の置き換え:空の場合は置き換え、それ以外の場合は空です。

文字列の置き換え:空の場合は置き換え、それ以外の場合は空です。

この種の略語があるかどうか疑問に思います。

現在はできます。

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最後のechotest0=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と同じ理由で、名前付き文字列変数だけでなく生の文字列でも機能したいです(後で必要でない場合は中間体を避けたい)。

関連情報