如何在bash中构build一个条件赋值?
我正在寻找一种方法来在bash中构build条件赋值:
在Java中,它看起来像这样:
int variable= (condition) ? 1 : 0;
根据乔纳森的评论:
variable=$(( 1 == 1 ? 1 : 0 ))
编辑:
我修改了原来的回答,只是echo
了条件操作符的值,实际上并没有显示任何赋值。
如果您想要在shell脚本中定义默认值,请使用如下所示的代码:
: ${VAR:="default"}
是的,这行以':'开始。 我在shell脚本中使用这个,所以我可以在ENV中覆盖variables,或使用默认值。
这是相关的,因为这是我最常用的那种逻辑。 ]
myvar="default" && [[ <some_condition_is_true> ]] && myvar="non-default"
实例:
DELIM="" && [[ "$APP_ENV_RESOLVED" != "" ]] && DELIM=$INNER_DELIM
条件也可以是“((…))”:
filepath=/proc/drbd && (( $# > 0 )) && filepath=$1
大到@Demosthenex,尤其是@Dennis Williamson,这是我见过的最简单,最简单的解决scheme。 让它为了简单的三元赋值而需要一堆括号 。 六十年代啊 ! 并把它放在一个例子中…
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
我想用string做一个有条件的分配,最后我得到:
SOWHAT=$([ "$MYVALUE" = "value" ] && echo "YES" || echo "NO")
除了其他更一般的答案(特别是根据乔纳森的评论和凯文的更一般的答案 [也支持string]),我想添加以下两个解决scheme:
根据条件将variables设置为0
或1
:
(如问题的例子所示)。
一般forms将阅读
(condition); variable=$?;
$variable
结果是0
或1
, condition
可以是任何有效的条件expression式 。
例如检查variables…
[[ $variableToCheck == "$othervariable, string or number to match" ]] variable=$?
…或检查文件的存在…
[ -f "$filepath" ] fileExists=$?
…或检查$myNumber
的数字值:
(( myNumber >= 1000000000 )) is_huge_number=$?
这个解决scheme的优点是
- 它支持任意的条件expression式 ,包括string
(在Jonathan 解决scheme的 算术expression式中不支持) - 那个
variable
在任何情况下都被声明 ,不像griffon的答案 :
[ -z "$variable" ] && variable="defaultValue"
如果你想稍后进行名称引用 (例如在一个函数中),这将会很重要。
请注意:在Bash中,特殊variables$?
始终包含之前执行的语句(或语句块;请参阅man bash了解更多详细信息)的退出代码。 因此,一个积极的结果通常用0
代表,而不是1
(见下面的评论,感谢Assimilater 指出 )。
因此,如果条件为真(例如[[2 eq 2]]
),那么$?=0
。 如果您的variables需要0或1(例如打印或进行math计算),那么您需要使用Jonathan的解决scheme variable=$(( 1 == 1 ? 1 : 0 ))
,或者 – 如果您想避免创build一个子shell或者有任意的条件 – 下面的解决scheme。
设置variables为任意值:
就像大多数其他答案中所做的那样,它可以进行如下调整:
(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
这个解决scheme的优点是
- 这可能会被认为比凯文的答案 更好一些
myvar="default" && [[ <some_condition_is_true> ]] && myvar="non-default"
,以及 -
$valueIfTrue
仅在需要$valueIfTrue
进行条件评估 ,
如果你想做点什么,这很重要- 与副作用一样
-
variable=$((i++))
或者 -
{ variable=$1; shift; }
-
- 高计算,就像
-
variable=$(find / -type f -name ListOfFilesWithThisNameOnMySystem)
-
- 与副作用一样
- 比ghostdog74的回答 短一点
(如果你有多个条件,这很好!) - 没有像皮埃尔的回答那样打开一个子壳
- 和上面一样:
- 它支持任意的条件expression式 ,包括string
(在Jonathan 解决scheme的 算术expression式中不支持) - 那个
variable
在任何情况下都被声明 ,不像griffon的答案 :
[ -z "$variable" ] && variable="defaultValue"
如果你想稍后进行名称引用 (例如在一个函数中),这将会很重要。
- 它支持任意的条件expression式 ,包括string
如果你想分配一个值,除非variables是空的使用这个:
[ -z "$variable" ] && variable="defaultValue"
你也可以把对方的条件放在[]
其他方式
case "$variable" in condition ) result=1;; *) result=0;; esac