有什么办法可以做这种事吗
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"`