如何在shell脚本中声明和使用布尔变量? POSIX
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在shell脚本中声明和使用布尔变量? POSIX相关的知识,希望对你有一定的参考价值。
我尝试使用以下语法在shell脚本中声明一个布尔变量:
variable=$false
variable=$true
它是否正确?另外,如果我想更新该变量,我会使用相同的语法吗?最后,使用布尔变量作为正确的表达式是以下语法:
if [ $variable ]
if [ !$variable ]
修订回答(2014年2月12日)
the_world_is_flat=true
# ...do something interesting...
if [ "$the_world_is_flat" = true ] ; then
echo 'Be careful not to fall off!'
fi
原始答案
警告:https://stackoverflow.com/a/21210966/89391
the_world_is_flat=true
# ...do something interesting...
if $the_world_is_flat ; then
echo 'Be careful not to fall off!'
fi
来自:Using boolean variables in Bash
这里包含原始答案的原因是因为2014年2月12日修订前的评论仅涉及原始答案,并且许多评论与修订后的答案相关时是错误的。例如,Dennis Williamson在2010年6月2日关于bash builtin true
的评论仅适用于原始答案,而非修订版。
Bill Parker is getting voted down,因为他的定义与正常的代码约定相反。通常,true定义为0,false定义为非零。 1将用于false,9999和-1也是如此。与函数返回值相同 - 0表示成功,任何非零表示失败。对不起,我还没有街头信誉投票或直接回复他。
Bash建议现在使用双括号作为习惯而不是单个括号,Mike Holt给出的链接解释了它们如何工作的差异。 7.3. Other Comparison Operators
首先,-eq
是一个数值运算符,所以有代码
#**** NOTE *** This gives error message *****
The_world_is_flat=0;
if [ "${The_world_is_flat}" -eq true ]; then
将发出一个错误语句,期望一个整数表达式。这适用于任一参数,因为它们都不是整数值。然而,如果我们在它周围放置双括号,它将不会发出错误声明,但它会产生错误的值(好的,在50%的可能排列中)。它将评估[[0 -eq true]] =成功,但也会[[0 -eq false]] =成功,这是错误的(嗯....那个内置是一个数值怎么样?)。
#**** NOTE *** This gives wrong output *****
The_world_is_flat=true;
if [[ "${The_world_is_flat}" -eq true ]]; then
条件的其他排列也会产生错误的输出。基本上,任何(除了上面列出的错误条件)将变量设置为数值并将其与true / false内置进行比较,或将变量设置为true / false内置并将其与数值进行比较。此外,任何将变量设置为true / false内置并使用-eq
进行比较的内容。因此,请避免使用-eq
进行布尔比较,并避免使用数值进行布尔比较。以下是将产生无效结果的排列摘要:
#With variable set as an integer and evaluating to true/false
#*** This will issue error warning and not run: *****
The_world_is_flat=0;
if [ "${The_world_is_flat}" -eq true ]; then
#With variable set as an integer and evaluating to true/false
#*** These statements will not evaluate properly: *****
The_world_is_flat=0;
if [ "${The_world_is_flat}" -eq true ]; then
#
if [[ "${The_world_is_flat}" -eq true ]]; then
#
if [ "${The_world_is_flat}" = true ]; then
#
if [[ "${The_world_is_flat}" = true ]]; then
#
if [ "${The_world_is_flat}" == true ]; then
#
if [[ "${The_world_is_flat}" == true ]]; then
#With variable set as an true/false builtin and evaluating to true/false
#*** These statements will not evaluate properly: *****
The_world_is_flat=true;
if [[ "${The_world_is_flat}" -eq true ]]; then
#
if [ "${The_world_is_flat}" = 0 ]; then
#
if [[ "${The_world_is_flat}" = 0 ]]; then
#
if [ "${The_world_is_flat}" == 0 ]; then
#
if [[ "${The_world_is_flat}" == 0 ]]; then
所以,现在到底有效。使用true / false内置函数进行比较和评估(正如Mike Hunt指出的那样,不要将它们括在引号中)。然后使用单或双等号(=或==)和单括号或双括号([]或[[]])。就个人而言,我喜欢双等号,因为它让我想起其他编程语言的逻辑比较,而双引号只是因为我喜欢打字。所以这些工作:
#With variable set as an integer and evaluating to true/false
#*** These statements will work properly: *****
#
The_world_is_flat=true/false;
if [ "${The_world_is_flat}" = true ]; then
#
if [[ "${The_world_is_flat}" = true ]]; then
#
if [ "${The_world_is_flat}" = true ]; then
#
if [[ "${The_world_is_flat}" == true ]]; then
你有它。
在许多编程语言中,布尔类型是或者实现为整数的子类型,其中true
的行为类似于1
,而false
的行为类似于0
:
Mathematically,boolean algebra类似于整数算术模2。因此,如果一种语言不提供本机布尔类型,最自然和有效的解决方案是使用整数。这几乎适用于任何语言。例如,在Bash中你可以这样做:
# val=1; ((val)) && echo "true" || echo "false"
true
# val=0; ((val)) && echo "true" || echo "false"
false
((表达))
根据ARITHMETIC EVALUATION下面描述的规则评估表达式。如果表达式的值不为零,则返回状态为0;否则返回状态为1.这与let“expression”完全相同。
我的发现和建议与其他帖子略有不同。我发现我可以使用true / false基本上就像任何“常规”语言一样,没有“箍跳”建议......不需要[]或显式字符串比较......我试过多个Linux发行版,我测试过bash,dash和busybox。我和她一起跑,没有她的爆炸...结果总是一样的。我不确定最初投票的帖子是在谈论什么。也许时代已经改变了,这就是它的全部内容?
如果将变量设置为true
,则在条件中计算结果为true。将其设置为false
,它的计算结果为false。很直接!唯一需要注意的是,UNDEFINED变量也会评估为真!如果它做了相反的事情会很好,但这就是诀窍 - 你只需要明确地将你的布尔值设置为真或假。
请参阅下面的示例bash和结果。如果你想确认,自己测试一下......
#!/bin/sh
#not yet defined...
echo "when set to ${myBool}"
if ${myBool}; then echo "it evaluates to true"; else echo "it evaluates to false"; fi;
myBool=true
echo "when set to ${myBool}"
if ${myBool}; then echo "it evaluates to true"; else echo "it evaluates to false"; fi;
myBool=false
echo "when set to ${myBool}"
if ${myBool}; then echo "it evaluates to true"; else echo "it evaluates to false"; fi;
产量
when set to
it evaluates to true
when set to true
it evaluates to true
when set to false
it evaluates to false
这是一个适合我的简单示例:
temp1=true
temp2=false
if [ "$temp1" = true ] || [ "$temp2" = true ]
then
echo "Do something."
else
echo "Do something else."
fi
我发现现有的答案令人困惑。
就个人而言,我只想拥有像C一样的外观和作品。
这个片段每天在制作中多次使用:
snapshotEvents=true
if ($snapshotEvents)
then
# do stuff if true
fi
为了让每个人都开心,我测试了:
snapshotEvents=false
if !($snapshotEvents)
then
# do stuff if false
fi
这也很好。
$snapshotEvents
评估变量值的内容。所以你需要$
。
你真的不需要括号,我发现它们很有帮助。
- 测试:GNU Bash,版本4.1.11(2) - 发布
- Bash Guide for Beginners,Machtelt Garrels,v1.11,2008
这是对miku的original answer的改进,它解决了Dennis Williamson对案例的担忧,其中变量未设置:
the_world_is_flat=true
if ${the_world_is_flat:-false} ; then
echo "Be careful not to fall off!"
fi
并测试变量是否为false
:
if ! ${the_world_is_flat:-false} ; then
echo "Be careful not to fall off!"
fi
关于变量中含有令人讨厌的内容的其他情况,这是任何输入程序的外部输入的问题。
在信任之前,必须验证任何外部输入。但是,当接收到该输入时,该验证必须只进行一次。
它不必像Dennis Williamson建议的每次使用变量那样影响程序的性能。
这是一个简短的if true
的实现。
# Function to test if a variable is set to "true"
_if () {
[ "${1}" == "true" ] && return 0
[ "${1}" == "True" ] && return 0
[ "${1}" == "Yes" ] && return 0
return 1
}
例1
my_boolean=true
_if ${my_boolean} && {
echo "True Is 以上是关于如何在shell脚本中声明和使用布尔变量? POSIX的主要内容,如果未能解决你的问题,请参考以下文章