关于语法:Bash中的三元运算符(?:)

Ternary operator (?:) in Bash

有什么办法可以做这种事吗

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

使用BASH?


三元运算符? :if/else的简称。

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}

如果设置了VAR,则会将VAR的值赋给a,否则会将默认值赋给20,这也可能是表达式的结果。

正如Alex在评论中指出的,这种方法在技术上被称为"参数扩展"。


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

其他答案中提出的cond && op1 || op2表达式有一个固有的缺陷:如果op1有一个非零退出状态,op2会无声地成为结果;在-e模式中也不会捕捉到错误。因此,只有当op1永远不会失败(例如,:true如果是内置的,或者没有任何失败操作(如除法和操作系统调用)的变量分配)时,该表达式才是安全的。

注意""报价。如果$b为空或有空格,第一对将防止语法错误。其他的则会阻止将所有空格转换为单个空格。


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"`