我想知道这类东西是否有简写。
目前我能做到。
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 或仿真zsh
中ksh
,您可以执行以下操作:
r=empty;output=${r[${#var}]}
在zsh
:
output=${${var:-empty$var}%$var}
否则,你总是可以做
output=;[ "$var" ]||output=empty
答案2
不确定我是否遵循您所说的“没有中介”的意思 - 如果您的意思是“在一行上完成所有操作”或“甚至不进行变量分配,直接完成所有操作”,但以下是每种解释的方法:
方法 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% 面向行的,并且“空情况”根据定义是零行。因此,sed
它将在有机会处理您告诉它的任何内容之前退出。另外,我对 Perl 不是很熟悉,但我无法弄清楚——尽管我猜 Perl 擅长的人可以。 Bash 的功能如{var:=param}
等。对于OP的情况并不是特别有帮助,但为了完整性我会提到它们。我希望它们对原始字符串进行操作,而不仅仅是命名字符串变量,原因与OP相同(如果以后不需要它们,我喜欢避免中间体)。