【问题标题】: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" 我认为这尽可能接近?:

标签: bash shell if-statement operators


【解决方案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”),我总是用它来分配默认值。
猜你喜欢
  • 1970-01-01
  • 2021-11-23
  • 2018-06-25
  • 1970-01-01
  • 2017-05-28
  • 1970-01-01
  • 2019-03-31
  • 2011-03-06
  • 1970-01-01
相关资源
最近更新 更多