Ternary operator (?:) in Bash
有什么办法可以做这种事吗
1 | int a = (b == 5) ? c : d; |
使用BASH?
三元运算符
1 2 3 4 | case"$b" in 5) a=$c ;; *) a=$d ;; esac |
或
1 | [[ $b = 5 ]] && a="$c" || a="$d" |
代码:
1 | a=$(["$b" == 5 ] && echo"$c" || echo"$d") |
如果条件只是检查是否设置了变量,那么甚至还有一个较短的形式:
1 | a=${VAR:-20} |
如果设置了
正如Alex在评论中指出的,这种方法在技术上被称为"参数扩展"。
1 | if ["$b" -eq 5 ]; then a="$c"; else a="$d"; fi |
其他答案中提出的
注意
1 | (( a = b==5 ? c : d )) # string + numeric |
1 | [ $b == 5 ] && { a=$c; true; } || a=$d |
当&;&;和之间的代码失效时,这将避免在之后意外执行部件。
这里还有另一个选项,您只需指定一次要分配的变量,而不管您分配的是字符串还是数字:
1 | VARIABLE=`[ test ] && echo VALUE_A || echo VALUE_B` |
只是一个想法。:)
let命令支持您需要的大多数基本运算符:
1 | let a=b==5?c:d; |
当然,这只适用于分配变量;它不能执行其他命令。
以下似乎适用于我的用例:
实例1 2 3 4 5 6 7 8 9 10 11 | $ tern 1 YES NO YES $ tern 0 YES NO NO $ tern 52 YES NO YES $ tern 52 YES NO 52 NO |
可以用在这样的脚本中:
1 2 | RESULT=$(tern 1 YES NO) echo"The result is $RESULT" |
燕鸥
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | function show_help() { echo"" echo"usage: BOOLEAN VALUE_IF_TRUE VALUE_IF_FALSE {FALSE_VALUE}" echo"" echo"e.g." 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" |
在三元运算符的shell脚本编写中,我们可以使用以下三种方法:
1 2 3 4 5 6 7 8 9 | [ $numVar == numVal ] && resVar="Yop" || resVar="Nop" Or resVar=$([ $numVar == numVal ] && echo"Yop" || echo"Nop") Or (( numVar == numVal ? (resVar=1) : (resVar=0) )) |
1 | (ping -c1 localhost&>/dev/null) && { echo"true"; } || { echo"false"; } |
对于bash中的三元条件也有非常相似的语法:
1 | a=$(( b == 5 ? 123 : 321 )) |
不幸的是,它只适用于数字——据我所知。
如果您想要类似的语法,可以使用这个
1 | a=$(( $((b==5)) ? c : d )) |
以下是一些选项:
1-如果有可能,在一行中使用if-then-else。
1 | if [["$2" =="raiz" ]] || [["$2" == '.' ]]; then pasta=''; else pasta="$2"; fi |
2-编写这样的函数:
1 2 3 4 5 6 | # 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 } |
像这样使用内部脚本
1 2 3 4 | result=`iif"$expr" 'yes' 'no'` # or even interpolating: result=`iif"$expr""positive""negative, because $1 is not true"` |
3-从案例中得到启发,更灵活的一行用法是:
1 2 3 4 | case"$expr" in ''|false|FALSE|null|NULL|0) echo"no...$expr";;*) echo"yep $expr";;esac # Expression can be something like: expr=`expr"$var1" '>'"$var2"` |