我尝试使用以下语法在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/89391the_world_is_flat=true

# ...do something interesting...

if $the_world_is_flat ; then

echo 'Be careful not to fall off!'

fi

From:在Bash中使用布尔变量

这里包括原始答案的原因是因为2014年2月12日修订前的评论仅涉及原始答案,并且与修订后的答案相关联时,许多评论都是错误的。 例如,丹尼斯·威廉姆森的有关bash的评论内置true在2010年6月2日只适用于原有的答案,而不是修改。

TL; DRbool=true

if [ "$bool" = true ]

美库(原始)答案的问题

我不推荐接受的答案1。 它的语法很漂亮,但它有一些缺陷。

假设我们有以下条件。if $var; then

echo 'Muahahaha!'

fi

在以下情况2中,此条件将评估为true并执行嵌套命令。# Variable var not defined beforehand. Case 1

var='' # Equivalent to var="". Case 2

var= # Case 3

unset var # Case 4

var='' # Case 5

通常,只有当您的“布尔”变量var在本例中)明确设置为true时,才会将条件评估为true。 所有其他案件都是危险的误导!

最后一种情况(#5)特别调皮,因为它会执行包含在变量中的命令(这就是为什么条件对于有效命令而言评估为真的原因3,4)。

这是一个无害的例子:var='echo this text will be displayed when the condition is evaluated'

if $var; then

echo 'Muahahaha!'

fi

# Outputs:

# this text will be displayed when the condition is evaluated

# Muahahaha!

引用你的变量更安全,例如, if "$var"; then if "$var"; then 。 在上述情况下,您应该会收到警告,指出找不到该命令。 但是我们仍然可以做得更好(见底部的我的建议)。

另请参阅麦克霍尔特对美库原始答案的解释。

Hbar的答案存在问题

这种方法也有意想不到的行为。var=false

if [ $var ]; then

echo "This won't print, var is false!"

fi

# Outputs:

# This won't print, var is false!

您会期望上述条件评估为false,因此从不执行嵌套语句。 惊喜!

引用值( "false" ),引用变量( "$var" ),或者使用test或[[而不是[ ,并没有区别。

我所推荐的:

以下是我建议你检查你的“布尔”的方法。 他们按预期工作。bool=true

if [ "$bool" = true ]; then

if [ "$bool" = "true" ]; then

if [[ "$bool" = true ]]; then

if [[ "$bool" = "true" ]]; then

if [[ "$bool" == true ]]; then

if [[ "$bool" == "true" ]]; then

if test "$bool" = true; then

if test "$bool" = "true"; then

他们几乎相当。 与其他答案中的方法相比,您将不得不输入更多的按键,但是您的代码将更具防御性。

脚注

美库的答案已经被编辑,不再包含(已知)的缺陷。

不是一个详尽的清单。

在这种情况下有效的命令意味着存在的命令。 命令使用是否正确无关紧要。 例如,即使没有这样的手册页存在, man woman仍然会被视为有效的命令。

对于无效的(不存在的)命令,Bash会简单地抱怨命令没有找到。

如果你在意长度,第一个建议是最短的。

似乎这里大约内建bash的一些误解true ,更具体地说,有关庆典是如何扩展和解释括号内的表达式。

miku的回答中的代码与bash内建的true , /bin/true以及true命令的任何其他风格完全没有关系。 在这种情况下, true只不过是一个简单的字符串,并且不会调用true命令/内建函数,既不是通过变量赋值也不是通过对条件表达式的求值。

以下代码在功能上与miku的答案中的代码相同:the_world_is_flat=yeah

if [ "$the_world_is_flat" = yeah ]; then

echo 'Be careful not to fall off!'

fi

这里唯一的区别是,比较的四个字符是'y','e','a'和'h',而不是't','r','u'和'e'。 而已。 没有任何尝试调用命令或内置命名为yeah ,也没有(在miku的例子中)当bash分析令牌为true时进行的任何特殊处理。 这只是一个字符串,而且完全是任意的。

更新(2/19/2014):在miku回答中的链接之后,现在我看到了一些混淆来自哪里。 Miku的答案使用了单个括号,但是他链接的代码段不使用括号。 只是:the_world_is_flat=true

if $the_world_is_flat; then

echo 'Be careful not to fall off!'

fi

这两个代码片段的行为方式都是一样的,但括号完全改变了底层的内容。

这里是bash在每种情况下所做的事情:

没有括号:

将变量$the_world_is_flat展开为字符串"true" 。

尝试将字符串"true"解析为命令。

查找并运行true命令(内建版或/bin/true ,具体取决于bash版本)。

将true命令(始终为0)的退出代码与0进行比较。回想一下,在大多数shell中,退出代码0表示成功,其他任何代码表示失败。

由于退出代码为0(成功),执行if语句的then子句

括号:

将变量$the_world_is_flat展开为字符串"true" 。

解析现在完全展开的条件表达式,其形式为string1 = string2 。 =运算符是bash的字符串比较运算符。 所以...

对"true"和"true"进行字符串比较。

是的,这两个字符串是相同的,所以条件的值是真的。

执行if语句的then子句。

无括号的代码有效,因为true命令返回0的退出代码,表示成功。 括号内的代码起作用,因为$the_world_is_flat的值与=右侧的字符串true值相同。

为了将这一点引入家庭,请考虑以下两段代码:

此代码(如果以root权限运行)将重新启动您的计算机:var=reboot

if $var; then

echo 'Muahahaha! You are going down!'

fi

此代码仅显示“Nice try”。 重新启动命令不被调用。var=reboot

if [ $var ]; then

echo 'Nice try.'

fi

更新(2014年4月14日)要回答评论中关于=和== AFAIK之间差异的问题,没有区别。 ==运算符是=的特定于bash的同义词,就我所见,它们在所有上下文中都完全相同。 但是,请注意,我正在专门讨论在[ ]或[[ ]]测试中使用的=和==字符串比较运算符。 我并不是建议=和==在bash中随处可以互换。 例如,你显然不能用==做变量赋值,比如var=="foo" (技术上你可以这样做,但是var的值将是"=foo" ,因为bash没有看到==运算符在这里,它看到一个= (赋值)运算符,后面是字面值="foo" ,它变成了"=foo" )。

此外,尽管=和==可以互换,但您应该记住,这些测试的工作方式取决于您在[ ]还是[[ ]]使用它,以及操作数是否被引用。 你可以在这里关于它的信息:7.3其他比较运算符(向下滚动到讨论=和== )。

链接地址: http://www.djcxy.com/p/4129.html

shell有bool运算么_如何在shell脚本中声明和使用布尔变量?相关推荐

  1. 在Shell脚本中声明和使用布尔变量示例

    需要定义一个名为failed的bash变量,并将值设置为False.当从cron作业调用我们的脚本时,特定的任务可能会失败,然后我需要将failed转换为True.基于$failed,我需要发送一封电 ...

  2. Linux教程 - 在Shell脚本中声明和使用布尔变量示例

    需要定义一个名为failed的bash变量,并将值设置为False.当从cron作业调用我们的脚本时,特定的任务可能会失败,然后我需要将failed转换为True.基于$failed,我需要发送一封电 ...

  3. sftp shell 批量上传文件_如何在shell脚本里使用sftp批量传送文件-阿里云开发者社区...

    主要步骤如下: 1.为运行shell脚本的本地用户生成密钥对 2.将其中的公钥分发到sftp欲登录的远程服务器上 3.编写并以上面的本地用户运行shell脚本 一.生成密钥对 在shell脚本中使用s ...

  4. python中第三方模块_如何在python脚本中包含第三方模块?

    我已经开始使用Python来自动化我工作中的重复任务,并且经常需要将对第三方模块的引用集成到我的脚本中.如何将这些文件直接包含在脚本中?我知道有一些方法可以在python安装文件夹(C:\Python ...

  5. python调用adb shell命令_如何在python脚本里面连续执行adb shell后面的各种命令

    如何在python脚本里面连续执行adb shell后面的各种命令 adb shell "cd /data/local && mkdir tmp" adb shel ...

  6. 如何在Python脚本中调用外部命令(就像在linux shell或Windows命令提示符下输入一样)

    如何在Python脚本中调用外部命令(就像在linux shell或Windows命令提示符下输入一样) python标准库中的subprocess可以解决这个问题. from subprocess ...

  7. 如何在bash脚本中提示用户进行确认? [重复]

    本文翻译自:How do I prompt a user for confirmation in bash script? [duplicate] This question already has ...

  8. js html保存json,如何在json文件中存储jQuery或javascript变量?

    我可以知道有没有机会将jquery变量保存在json文件中?提前致谢.如何在json文件中存储jQuery或javascript变量? 我: var image='/test/test.png'; 我 ...

  9. postgres 显示变量_sql - 如何在PostgreSQL查询中声明变量

    sql - 如何在PostgreSQL查询中声明变量 如何声明变量以用于PostgreSQL 8.3查询? 在MS SQL Server中,我可以这样做: DECLARE @myvar INT SET ...

最新文章

  1. OpenJDK 编译-Linux环境
  2. 总结下我所学 设计模式
  3. WINCE6.0+S3C2443的启动过程---内核启动
  4. 关于Exception类
  5. 花了140万留学美国,回国工资仅4500?用数据来揭晓海归留学的真实性价比
  6. 配置虚拟目录的方式(Linux下/windows下)
  7. ABAP新的关键字:BASE
  8. 光纤收发器在高清网络视频监控工程项目中的应用
  9. 彻底崩溃,一个电脑白痴和黑客的对话!
  10. Wamp修改httpd.conf中的DocumentRoot不生效解决办法
  11. HTML入门学习 -- HTML5 视频与音频
  12. spring jdbcTemplate中获取jdbc Connection并执行操作
  13. word怎么显示计算机数字,如何键入word2007圆圈数字1到10及以上?
  14. 酷睿i7 8750h相当于什么水平 i78750h属于什么级别
  15. 安卓res资源混淆器
  16. 香港科大【526清水湾思享会@杭州】暨香港科大EMBA第四届校友会【浙江分会】启动仪式成功举行...
  17. 为什么机器学习对嵌入式开发很重要?
  18. Flink集群之flink集群的启动问题:start-cluster.sh
  19. 计算机软件著作权的权利归属如何确定
  20. css网站结课设计,毕业设计(论文)-《DIV+CSS》课程网站的开发.doc

热门文章

  1. 单文件组件(SFC)
  2. BCS2022系列活动|冬奥网络安全“零事故”宣传周5月22日精彩预告
  3. NAS信令学习笔记 ——IP地址分配
  4. 关于http接口开发中json格式数据编码问题处理
  5. 守卫信息安全,如何高效检测和定位恶意监视设备?
  6. 【OPC UA】使用C#读取OPC UA电液控数据
  7. 57 元组和列表的区别
  8. 高考生,雨女有瓜!谁动了你的个人信息?
  9. 基于Wav2Lip+GFPGAN的高清版AI主播
  10. 记一次解决Mysql:Incorrect string value: ‘\xF0\x9F\x8D\x83\xF0\x9F...‘ for column 插入emoji表情报错问题