有没有办法做这样的事情
int a = (b == 5) ? c : d;
使用Bash?
((...))
。请参阅Shell算术。
$(( ))
和算术运算(( ))
。另请参阅https://mywiki.wooledge.org/ArithmeticExpression
。
有没有办法做这样的事情
int a = (b == 5) ? c : d;
使用Bash?
((...))
。请参阅Shell算术。
$(( ))
和算术运算(( ))
。另请参阅https://mywiki.wooledge.org/ArithmeticExpression
。
Answers:
三元运算符? :
只是if/else
case "$b" in
5) a=$c ;;
*) a=$d ;;
esac
要么
[[ $b = 5 ]] && a="$c" || a="$d"
=
运算符将测试字符串是否相等,而不是数字相等(即,[[ 05 = 5 ]]
是否为假)。如果要进行数值比较,请-eq
改用。
if/then/else
cond && op1 || op2
构造有一个固有的错误:如果op1
由于某种原因而具有非零退出状态,则结果将静默变为op2
。if cond; then op1; else op2; fi
也是一行,没有那个缺陷。
码:
a=$([ "$b" == 5 ] && echo "$c" || echo "$d")
echo "$c"
是带别名的多行命令(例如echo 1; echo 2
),则应将其括在括号中。
&&
。否则,如果成功但失败,a && b || c
将“意外”运行。c
a
b
如果条件仅是检查是否设置了变量,则甚至有一个较短的形式:
a=${VAR:-20}
将分配给if 设置a
的值,否则将为其分配默认值-这也可以是表达式的结果。VAR
VAR
20
正如Alex在评论中指出的那样,该方法在技术上称为“参数扩展”。
a=${1:-'my-hyphenated-text'}
${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联机帮助页中的“ PARAMETER EXPANSION”),但是我对它们的可移植性并不了解。
(( 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-in而不是true
保存exec
外部程序。
&&
.. ||
并仍然在它们之间捕获失败的命令?
&&
,||
按照定义适用于它们之前的整个命令。因此,如果前面有两个命令(不管它们如何组合),则不能将其仅应用于其中一个,而不能应用于另一个。您可以模拟if
/ then
/ else
用标志变量的逻辑,但何必如果有if
/ then
/ else
合适?
该让命令支持基本算一个需要的最:
let a=b==5?c:d;
自然,这仅适用于分配变量。它无法执行其他命令。
这是另一个选项,您只需指定一次要分配的变量,而分配的内容是字符串还是数字都没有关系:
VARIABLE=`[ test ] && echo VALUE_A || echo VALUE_B`
只是一个想法。:)
[ test ]
。因此,只有在您“知道”该命令不会向stdout输出任何内容时,该结构才可以安全使用。
VARIABLE="`[ test ] && echo \"VALUE_A\" || echo \"VALUE_B\"`"
。
以下似乎适用于我的用例:
$ 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的一部分吗?Mac似乎没有它
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) ))
bash中的三元条件语法也非常相似:
a=$(( b == 5 ? 123 : 321 ))
不幸的是,据我所知,它仅适用于数字。
如果您想要类似的语法,可以使用它
a=$(( $((b==5)) ? c : d ))
a=$(((b==5) ? : c : d))
- $((...))
仅在我们要将算术结果分配给另一个变量时才需要。
以下是一些选项:
1-如果在另一行中使用,则可以使用。
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"`
bash
确实具有与“三元运算符”相似的内容,但是在bash
此称为“条件运算符”expr?expr:expr
(请参阅man bash
goto节“算术评估”)。请记住,bash
“条件运算符”非常棘手,并且有些陷阱。