三元运算符(?:)在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 || op2
expression式有一个固有的缺陷:如果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 ))