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? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

Swift:SwiftUI 视图的多个条件的内联评估

赋值运算符左侧的三元条件运算符

仅当 JavaScript 中的三元运算符中的条件为真时才赋值

三元运算符

三元运算

C中的三元(条件)运算符