我正在寻找一种在bash中建立条件分配的方法:
在Java中,它看起来像这样:
int variable= (condition) ? 1 : 0;
Answers:
根据乔纳森的评论:
variable=$(( 1 == 1 ? 1 : 0 ))
我修改了最初的答案,该答案只是echo
“条件运算符”的值,它实际上并未显示任何赋值。
(( variable = 1 == 1 ? 1 : 0 ))
或(( variable = (1 == 1) ? 1 : 0 ))
但可以说,答案更具有可读性。
如果您想要一种在Shell脚本中定义默认值的方法,请使用如下代码:
: ${VAR:="default"}
是的,该行以“:”开头。我在shell脚本中使用了它,因此可以覆盖ENV中的变量,也可以使用默认值。
这是相关的,因为这是我最常用的那种逻辑用例。;]
除了其他更一般的答案(特别是根据乔纳森的评论和凯文的更一般的答案[也支持字符串]),我想添加以下两种解决方案:
0
或1
(如问题的示例所示。)
一般形式为
(condition); variable=$?;
其中$variable
的结果之中任一0
或1
并condition
可以是任何有效的条件表达式。
例如检查变量...
[[ $variableToCheck == "$othervariable, string or number to match" ]]
variable=$?
...或检查文件的存在...
[ -f "$filepath" ]
fileExists=$?
...或检查的数字值$myNumber
:
(( myNumber >= 1000000000 ))
is_huge_number=$?
variable
被宣布在任何情况下,与格里芬的答案:[ -z "$variable" ] && variable="defaultValue"
请注意:在Bash中,特殊变量$?
始终包含先前执行的语句(或语句块;请参阅man bash的更多详细信息)的退出代码。因此,肯定的结果通常由value表示0
,而不是1
(请参见下面的评论,感谢Assimilater指出)。因此,如果条件为true(例如[[2 eq 2]]
),则$?=0
。
如果相反,您需要在变量中使用0或1(例如,进行打印或进行数学计算),则需要使用带前导感叹号的布尔求反(如GypsySpellweaver在下面的注释中指出):( ! condition ); variable=$?
或! ( condition ); variable=$?
。(但是,关于发生的事情的可读性可能不太明显。)
乔纳森(Jonathan)的另一种可能的解决方案是variable=$(( 1 == 1 ? 1 : 0 ))
-但是,它正在创建一个子外壳。
如果要避免创建子平台,保持良好的可读性或具有任意条件,请使用以下解决方案之一。
正如在其他大多数答案中所做的那样,它可以进行如下调整:
(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)
[ "$1" == "--all" ] ; allperiods=$? ; echo $allperiods
executable && executesWhenOk || executesWhenNotOk
,在我们的场景中,测试是“可执行的”(准确地说是语句),而特殊变量$?
包含最后一条语句的结果代码。希望有助于澄清。
1
是true
和0
是false
,可以很容易地在这种情况下与实现NOT !
操作者施加到表达。在“表达式”的内部或外部。( ! condition ); variable=$?
或! ( condition ); variable=$?
这样[ ! -f "$filepath" ]; fileExists=$?
的程序员习惯于:存在1个文件,而缺少0个文件。
我想对字符串进行条件赋值,结果是:
SOWHAT=$([ "$MYVALUE" = "value" ] && echo "YES" || echo "NO")
大起大落对@Demosthenex,尤其是@Dennis威廉姆森的最短和最简单的我见过的解决方案。将其保留为bash,需要为简单的三元分配添加一堆括号。啊,六十年代!并在一个示例中将它们放在一起...
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
bash
箭袋中使用的极好的语法箭头……对于好奇和/或冒险的人来说,在这里发现它,这种条件赋值也可以与export
语句配合使用-您可以将其放在冒号和美元之间,签署声明-y部分,例如: export ${YO_DOGG:="global environment default"}
iphonesimulator
不包含字符串os
,因此上述解决方案将以结尾OTHERSDK=iphonesimulator
。
如果要分配一个值,除非变量为空,请使用以下命令:
[ -z "$variable" ] && variable="defaultValue"
您也可以将其他条件放在 []
: ${variable:='defaultValue'}
variable=$(( 1 == 1 ? 1 : 0 ))
只要第一个'='符号之间没有空格,它就可以工作;您可以在此之后省略所有空格,并且也可以使用-但请考虑可读性。