我正在寻找一种在bash中构建条件赋值的方法:
在Java中它看起来像这样:
int variable= (condition) ? 1 : 0;
答案 0 :(得分:58)
如果要在shell脚本中定义默认值,请使用以下代码:
: ${VAR:="default"}
是的,该行以':'开头。我在shell脚本中使用它,所以我可以覆盖ENV中的变量,或使用默认值。
这是相关的,因为这是我对这种逻辑最常见的用例。 ]
答案 1 :(得分:49)
根据乔纳森的评论:
variable=$(( 1 == 1 ? 1 : 0 ))
我修改了原来的答案,只是echo
'条件运算符的值,它实际上没有显示任何赋值。
答案 2 :(得分:23)
myvar="default" && [[ <some_condition_is_true> ]] && myvar="non-default"
真实的例子:
DELIM="" && [[ "$APP_ENV_RESOLVED" != "" ]] && DELIM=$INNER_DELIM
条件可以是“((...))”:
filepath=/proc/drbd && (( $# > 0 )) && filepath=$1
答案 3 :(得分:17)
除了其他更一般的答案(特别是根据Jonathan的comment和Kevin的more general answer [也支持字符串]),我想添加以下两个解决方案:
0
或1
:(正如问题的例子所示。)
一般表格会读取
(condition); variable=$?;
其中$variable
导致0
或1
,condition
可以是任何有效conditional expression。
E.g。检查变量......
[[ $variableToCheck == "$othervariable, string or number to match" ]]
variable=$?
...或检查文件的存在......
[ -f "$filepath" ]
fileExists=$?
...或检查$myNumber
的数值:
(( myNumber >= 1000000000 ))
is_huge_number=$?
variable
在任何情况下都被声明为,与griffon的answer不同:[ -z "$variable" ] && variable="defaultValue"
如果你不重要我希望稍后nameref(例如从一个函数中)。
请注意:在Bash中,特殊变量$?
始终包含先前执行的语句的退出代码(或语句块;有关详细信息,请参阅man bash)。因此,正面结果通常由值0
表示,而不是1
(请参阅我的评论below,感谢Assimilater pointing it out)。因此,如果条件为真(例如[[2 eq 2]]
),则$?=0
。
如果您在变量中需要0或1(例如打印或进行数学计算),则需要使用前导感叹号(如下面comments中的GypsySpellweaver所指出的那样)使用布尔否定: ( ! condition ); variable=$?
或! ( condition ); variable=$?
。 (但是,就发生的事情而言,可读性可能不太明显。)
Jonathan的另一个可能的solution将是variable=$(( 1 == 1 ? 1 : 0 ))
- 但是,它正在创建一个子shell。
如果您想避免创建subhel,保持良好的可读性或具有任意条件,请使用以下解决方案之一。
正如大多数其他答案所做的那样,它可以改编如下:
(condition) \
&& variable=true \
|| variable=false
例如
[[ $variableToCheck == "$othervariable, string or number to match" ]] \
&& variable="$valueIfTrue" \
|| variable="$valueIfFalse"
或者在肯定检查中获得1,在失败时获得0(如问题示例中所示):
[[ $variableToCheck == "$othervariable, string or number to match" ]] \
&& variable=1 \
|| variable=0
(对于最后一个例子, - 正如上面的注释中已经提到的那样 - 使用带有感叹号的布尔否定可以实现相同的目的:
[[ ! $variableToCheck == "$othervariable, string or number to match" ]]
variable=$?
myvar="default" && [[ <some_condition_is_true> ]] && myvar="non-default"
和$valueIfTrue
有条件评估仅如果需要,这对于你做某件事情很重要
variable=$((i++))
或{ variable=$1; shift; }
variable=$(find / -type f -name ListOfFilesWithThisNameOnMySystem)
variable
在任何情况下都被声明为,与griffon的answer不同:[ -z "$variable" ] && variable="defaultValue"
如果你不重要我希望稍后nameref(例如从一个函数中)。答案 4 :(得分:8)
我想用字符串进行条件赋值,最后得到:
SOWHAT=$([ "$MYVALUE" = "value" ] && echo "YES" || echo "NO")
答案 5 :(得分:6)
Big ups 到@Demosthenex,尤其是@Dennis Williamson,我看到了最短,最简单的解决方案。 将其保留为bash ,需要一堆括号来进行简单的三元分配。 啊,60年代!并将它们放在一个例子中......
echo $BASHRULES; # not defined
# no output
: ${BASHRULES:="SCHOOL"} # assign the variable
echo $BASHRULES # check it
SCHOOL # correct answer
: ${BASHRULES="FOREVER?"} # notice the slightly different syntax for the conditional assignment
echo $BASHRULES # let's see what happened!
SCHOOL # unchanged! (it was already defined)
我很久以前就写过了......这些天我可能对像...这样的解决方案感到更兴奋。
PLATFORM=iphonesimulator
OTHERSDK=iphone && [[ $PLATFORM=~os ]] \
&& OTHERSDK+=simulator \
|| OTHERSDK+=os
$OTHERSDK
⇥iphoneos
答案 6 :(得分:4)
如果要分配值,除非变量为空,请使用:
[ -z "$variable" ] && variable="defaultValue"
您也可以在[]
答案 7 :(得分:3)
另一种方式
case "$variable" in
condition ) result=1;;
*) result=0;;
esac