三元运算符(?:)在Bash中

有没有办法做这样的事情

int a = (b == 5) ? c : d; 

使用Bash?

三元运算符? : ? :只是if/else缩写

 case "$b" in 5) a=$c ;; *) a=$d ;; esac 

要么

  [[ $b = 5 ]] && a="$c" || a="$d" 

码:

 a=$([ "$b" == 5 ] && echo "$c" || echo "$d") 

如果条件只是检查是否设置了一个variables,甚至有一个更短的forms:

 a=${VAR:-20} 

如果设置了VAR将赋值为VAR ,否则将赋值为默认值20 – 这也可以是expression式的结果。

正如alex在备注中指出的,这种方法在技术上被称为“参数扩展”。

 (( a = b==5 ? c : d )) # string + numeric 
 [ $b == 5 ] && { a=$c; true; } || a=$d 

这将避免执行||之后的部分 当&&和||之间的代码出现意外时 失败。

 if [ "$b" -eq 5 ]; then a="$c"; else a="$d"; fi 

cond && op1 || op2 在其他答案中提出的cond && op1 || op2expression式有一个固有的缺陷:如果op1的非零退出状态, op2默默成为结果; 错误也不会在-e模式下被捕获。

注意引号。 如果$b是空白或有空格,第一对将防止语法错误。 其他人将阻止将所有空格转换为单个空格。

let命令支持大多数需要的基本操作符:

 let a=b==5?c:d; 

当然,这只适用于分配variables; 它不能执行其他命令。

这里是另外一个选项,你只需要指定一次赋值的variables,不pipe你的赋值是一个string还是一个数字:

 VARIABLE=`[ test ] && echo VALUE_A || echo VALUE_B` 

只是一个想法。 🙂

 (ping -c1 localhost&>/dev/null) && { echo "true"; } || { echo "false"; } 

以下似乎适用于我的使用情况:

例子

 $ tern 1 YES NO YES $ tern 0 YES NO NO $ tern 52 YES NO YES $ tern 52 YES NO 52 NO 

并可以像这样使用脚本:

 RESULT=$(tern 1 YES NO) echo "The result is $RESULT" 

燕鸥

 function show_help() { echo "" echo "usage: BOOLEAN VALUE_IF_TRUE VALUE_IF_FALSE {FALSE_VALUE}" echo "" echo "eg " echo "" echo "tern 1 YES NO => YES" echo "tern 0 YES NO => NO" echo "tern "" YES NO => NO" echo "tern "ANY STRING THAT ISNT 1" YES NO => NO" echo "ME=$(tern 0 YES NO) => ME contains NO" echo "" exit } if [ "$1" == "help" ] then show_help fi if [ -z "$3" ] then show_help fi # Set a default value for what is "false" -> 0 FALSE_VALUE=${4:-0} function main { if [ "$1" == "$FALSE_VALUE" ]; then echo $3 exit; fi; echo $2 } main "$1" "$2" "$3" 

这里有一些选项:

1-如果在一行中使用,那么这是可能的。

 if [[ "$2" == "raiz" ]] || [[ "$2" == '.' ]]; then pasta=''; else pasta="$2"; fi 

2-写这样的function:

  # Once upon a time, there was an 'iif' function in MS VB ... function iif(){ # Echoes $2 if 1,banana,true,etc and $3 if false,null,0,'' case $1 in ''|false|FALSE|null|NULL|0) echo $3;;*) echo $2;;esac } 

像这样使用里面的脚本

 result=`iif "$expr" 'yes' 'no'` # or even interpolating: result=`iif "$expr" "positive" "negative, because $1 is not true"` 

3-在案例答案的启发下,一个更灵活和一个线路的使用是:

  case "$expr" in ''|false|FALSE|null|NULL|0) echo "no...$expr";;*) echo "yep $expr";;esac # Expression can be something like: expr=`expr "$var1" '>' "$var2"` 

如果你想要类似的语法,你可以使用它

 a=$(( $((b==5)) ? c : d ))