前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >shell判空true false的一个坑

shell判空true false的一个坑

作者头像
潇洒
发布2023-10-20 12:22:37
4140
发布2023-10-20 12:22:37
举报
文章被收录于专栏:石头岛

前言

在写shell的时候发现一个违反直觉的的操作,一般判断一个变量是否为boolean,习惯上使用if param。 但是在写脚本的时候,发现无论如何,不会走false。

反例

在很多编程语言中,可以直接使用 if boolean,来判断这个变量是否为true。但是在shell当中直觉上是可以,但实际上是不能。

代码语言:javascript
复制
aaa=false
if [[ $aaa ]];then
  echo "is true"
else
  echo "is false"
fi

结是为is true,是不是违反直觉。

为什么这段脚本会进is true

shell 是怎么执行这一段脚本的:

代码语言:javascript
复制
sh -x test.sh

结果:

代码语言:javascript
复制
+ aaa=false
+ [[ -n false ]]
+ echo 'is true'
is true

可以看到,如果是一个变量,shell 会默认加上-n来判断变量是否为空。aaa是有值的,而且在shell里,false 并不代表false。真正代表true和false的是01,没想到吧。

正常判断

注意,这里用的是=,而不是==,也是违反直觉,很多编程语言都是使用的==

代码语言:javascript
复制
aaa=false
if [ $aaa = true ];then
  echo "is true"
else
  echo "is false"
fi

在中括号[ ]中使用==是bash里的做法, 不符合posix标准。 posix,是通用操作系统接口的缩写。

Do not use ==. It is only valid in a limited set of shells, and will produce unspecified behavior.

尽量使用 = 而不是 ==

在shell当中==的作用是完全匹配。但是在不同的shell当中表现不同。我没有一个一个试,在查这个问题的时候,看到这段结论:

不支持的shell

dash: 4: [: A: unexpected operator not support == tcsh: test: unknown operator ==

支持的shell

bash: support == ksh: support ==

引用:http://stackoverflow.com/questions/10849297/compare-a-string-in-unix

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018-07-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 反例
  • 正常判断
  • 尽量使用 = 而不是 ==
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档