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

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

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

使用BASH?

@荷兰语的答案表明,bash确实有类似于"三元运算符"的东西,但是在bash中,这被称为"条件运算符"expr?expr:expr(见man bashgoto部分"算术评估")。请记住,bash的"条件运算符"很棘手,并且有一些问题。

bash确实有一个整数的三元运算符,它在算术表达式((...))中工作。请参见Shell算术。

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

case"$b" in

5) a=$c ;;

*) a=$d ;;

esac

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

注意,=运算符测试字符串相等,而不是数字相等(即[[ 05 = 5 ]]为假)。如果要进行数字比较,请使用-eq。

对if/then/else来说,这更像是一个简短的形式。

这是一种利用短路行为获得三元操作员效应的天才方法:):)

@熊基亚米奥夫,您的双括号表达式不正确。最后2个赋值操作数(c和d的顺序必须颠倒,以与op问题中的?操作符:[[ $b = 5 ]] && a="$d" || a="$c"相等。

为什么是[[和]]?它的工作方式与此相同:[$B=5]&&A="$C"A="$D"

如果它对任何人都有帮助,我根据@ghostdog74的回答使用了以下内容:(( 3 > 1 )) && echo"yup" || echo"nooope"),因此answer=$( (( 3 > 1 )) && echo"ouiii" || echo"nooope")或更短的(( 3 > 7 )) && answer="yup" || answer="nop"。

@kdub看到这个答案

@stephaneag你在(3 > 1))有一个闭合支架太多了。最后一个应该省掉。

kdubs文档建议在进行直接数字比较时使用[[]]。[]对字符串更有效。

cond && op1 || op2构造有一个固有的bug:如果op1出于任何原因具有非零退出状态,结果将静默变为op2。if cond; then op1; else op2; fi也是一条线,没有这个缺陷。

如果不使用op1的退出状态,可以使用cond && { op1 ||: } || op2。:相当于true(stackoverflow.com/questions/3224878/…--在posix shell中需要:,显然比true更轻便,但要了解更多信息,请阅读。)

代码:

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

这比其他人好…关于第三个运算符的要点是它是一个运算符,因此它的适当上下文在表达式中,因此它必须返回一个值。

这是最简洁的方法。请注意,如果带有echo"$c"的部分是一个有别名的多行命令(如echo 1; echo 2命令),则应将其括在括号中。

与另一个答案中的错误相同。

这也将捕获被测试命令的任何输出(是的,在这个特定的情况下,我们"知道"它不会产生任何输出)。

如果您确信&&之后的命令不会具有非零退出状态,则此运算符链的行为仅类似于三元运算符。否则,如果a成功而b失败,a && b || c将"意外"运行c。

如果条件只是检查是否设置了变量,那么甚至还有一个较短的形式:

a=${VAR:-20}

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

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

在传递包含连字符的字符串参数的情况下,我必须使用引号:a=${1:-'my-hyphenated-text'}。

lazy的链接-除了替换(:-外,还有其他运算符)

@不幸的是,没有像${VAR:-yes:-no}这样的语法。

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

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

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

"可读性计数"

我也见过预混,我相信["x$b" -eq"x" ]专门用来测试空字符串。我喜欢使用zsh使用的语法(zshexpn手册页中的"参数扩展"),但我对它们的可移植性知之甚少。

@johnp stackoverflow.com/questions/174119/…

(( a = b==5 ? c : d )) # string + numeric

这对数值比较和赋值很好,但如果将其用于字符串比较和赋值,则会产生不可预测的结果….(( ))将任何/所有字符串视为0。

也可以这样写:a=$(( b==5 ? c : d ))。

[ $b == 5 ] && { a=$c; true; } || a=$d

当&&和之间的代码失效时,这将避免在之后意外执行部件。

根据{}中的命令,需要;。(补充说)

在-e模式下,仍然无法捕捉错误:(set -o errexit; [ 5 == 5 ] && { false; true; echo"success"; } || echo"failure"; echo $?; echo"further on";)->success 0 further on。

使用:bulit而不是true来保存exec外部程序。

@伊凡·波兹捷耶夫有没有办法使用&&。还是在他们之间接到一个失败的命令?

@Tomhale No.&&和||根据定义适用于他们之前的整个命令。因此,如果前面有两个命令(不管它们是如何组合的),就不能将其仅应用于其中一个命令,而不能应用于另一个命令。你可以用标志变量来模仿if/then/else逻辑,但是如果有if/then/else的话,为什么还要麻烦呢?

这里还有另一个选项,您只需指定一次要分配的变量,而不管您分配的是字符串还是数字:

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

只是一个想法。:)

一个主要的缺点:它还将捕获[ test ]的stdout。因此,只有当您"知道"该命令没有向stdout输出任何内容时,才可以安全地使用该构造。

与bash‌&8203;/…中的stackoverflow.com/questions/3953645/ternary operator相同,还需要引用和转义引号。容空间版本将类似于VARIABLE="`[ test ] && echo "VALUE_A" || echo "VALUE_B"`"。

let命令支持您需要的大多数基本运算符:

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

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

它完全等同于(…),因此它只对算术表达式有效

以下似乎适用于我的用例:实例

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

解释得很清楚。非常完整。非常冗长的我喜欢三件事。;-)

tern是bash的一部分吗?麦克好像没有

嘿,@tao極者无能为力而生-这是bash脚本的名称-将上面的"tern"部分保存到名为"tern"的文件中,然后在同一文件夹中运行chmod 700 tern。现在,您的终端将有一个tern命令

在三元运算符的shell脚本编写中,我们可以使用以下三种方法:

[ $numVar == numVal ] && resVar="Yop" || resVar="Nop"

Or

resVar=$([ $numVar == numVal ] && echo"Yop" || echo"Nop")

Or

(( numVar == numVal ? (resVar=1) : (resVar=0) ))

这实际上是(这三个例子中的第一个和第二个)对imho这个问题最合适的答案。

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

对于bash中的三元条件也有非常相似的语法:

a=$(( b == 5 ? 123 : 321  ))

不幸的是,它只适用于数字——据我所知。

如果您想要类似的语法,可以使用这个

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

这只适用于整数。您可以更简单地编写它,因为只有当我们想将算术结果赋给另一个变量时,才需要a=$(((b==5) ? : c : d))-$((...))。

以下是一些选项:

1-如果有可能,在一行中使用if-then-else。

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

2-编写这样的函数:

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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值