bash中是不是有带赋值(三元条件)的内联if? [复制]
Posted
技术标签:
【中文标题】bash中是不是有带赋值(三元条件)的内联if? [复制]【英文标题】:Is there an inline-if with assignment (ternary conditional) in bash? [duplicate]bash中是否有带赋值(三元条件)的内联if? [复制] 【发布时间】:2012-12-15 21:54:31 【问题描述】:可能重复:Ternary operator (?:) in Bash
如果这是 AS3 或 Java,我会执行以下操作:
fileName = dirName + "/" + (useDefault ? defaultName : customName) + ".txt";
但在 shell 中,这似乎是不必要的复杂,需要几行代码,以及相当多的重复代码。
if [ $useDefault ]; then
fileName="$dirName/$defaultName.txt"
else
fileName="$dirName/$customName.txt"
fi
您可以将所有内容压缩成一行,但这会极大地牺牲清晰度。
有没有更好的方法在 shell 中编写带有变量赋值的内联 if
?
【问题讨论】:
William Purcell 的回答不如我的直接,但如果假设$useDefault
控制是否使用默认名称,它可能是一个更简洁的解决方案。
我已更新我的答案以正确引用所有内容。
fileName="$dirName/$([ $useDefault ] && echo "$defaultName" || echo "$customName").txt"
我认为这尽可能接近?:
。
【参考方案1】:
shell 中没有?:
条件运算符,但您可以像这样使代码少一些冗余:
if [ $useDefault ]; then
tmpname="$defaultName"
else
tmpname="$customName"
fi
fileName="$dirName/$tmpname.txt"
或者您可以编写自己的 shell 函数,其作用类似于 ?:
运算符:
cond()
if [ "$1" ] ; then
echo "$2"
else
echo "$3"
fi
fileName="$dirname/$(cond "$useDefault" "$defaultName" "$customName").txt"
虽然这可能有点矫枉过正(它会评估所有三个参数)。
感谢 Gordon Davisson 在 cmets 中指出引用嵌套在 $(...)
内。
【讨论】:
我真的很喜欢cond
函数,这就是我接受答案的原因,尽管第一个解决方案也确实节省了重复代码。
您应该将$(cond ... )
留在双引号内(即fileName="$dirname/$(cond "$useDefault" "$defaultName" "$customName").txt"
)——这样可以防止对字符串 cond 返回进行一些几乎肯定不需要的额外解析。
@GordonDavisson:我考虑过这一点,但它将变量引用 $useDefault
et al 留在引号之外。我不确定有没有好的解决方案。
@KeithThompson:这不是问题;引号与$()
嵌套在一起,因此$useDefault
将被视为双引号。【参考方案2】:
只写:
fileName=$customName:-$defaultName.txt
它与您拥有的不太一样,因为它不检查useDefault
。相反,它只检查是否设置了customName
。当您想使用默认值时,无需设置useDefault
,只需取消设置customName
。
【讨论】:
您能否提供有关此:-
运算符的更多信息? (或者至少是我可以在 Google 上搜索的名称)
只需在 bash 手册页中搜索 :-
。任何sh
文档都会在parameter expansion
等标题下对此进行描述。
对于bash
,见parameter expansion;对于 POSIX shell,请参阅parameter expansion。
伟大的介绍,然后建立它:wiki.bash-hackers.org/syntax/pe#use_an_alternate_value
我喜欢这个,它就像 Perl 中的 // 运算符(“Undefined-or”),我总是用它来分配默认值。以上是关于bash中是不是有带赋值(三元条件)的内联if? [复制]的主要内容,如果未能解决你的问题,请参考以下文章