找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
广告投放联系QQ68610888
查看: 4626|回复: 0

写给入门新手------关于shell脚本中条件比较变量用与不用双引号""的区别

[复制链接]
发表于 2020-5-7 11:33 | 显示全部楼层 |阅读模式
入门级,仅供新手参考。
下面是个实例:
  1. a=""
  2. b=0

  3. if [ "$a" != 0 -a "$b" == 0 ]; then
  4. echo "yes"
  5. fi
  6. #################################
  7. if [ $a != 0 -a $b == 0 ]; then
  8. echo "yes"
  9. fi
复制代码

上下两种粗略看起来是一样的,大多数时候都不会出现问题。但是事有例外。


上方有双引号,下方无双引号。

下面是运行过程:
  1. a=""
  2. + a=
  3. b=0
  4. + b=0

  5. if [ "$a" != 0 -a "$b" == 0 ]; then
  6. echo "yes"
  7. fi
  8. + '['  '!=' 0 -a 0 '==' 0 ]
  9. + echo yes
  10. yes

  11. if [ $a != 0 -a $b == 0 ]; then
  12. echo "yes"
  13. fi+ '[' '!=' 0 -a 0 '==' 0 ]
  14. sh: 0: unknown operand
复制代码
下方判断直接报错。
a不等于0的情况有很多种,比如a不存在,或者a是1-9中任意数值。我们理所当然认为a不存在时,也应该归入a不等于0判断。
出现问题的原因是,当变量为空时,无双引号就无法进行比较。为避免这种情况,最好都用双引号。
如何已经存在的脚本,太复杂心思去改那么多了,可以当a不存在时,人为赋予一个不是0的值:[ -z "$a" ] && a=1(我们只需要关心它不是0,到底是1还是9毫无关系) ,这样就避免问题了。
但是我要想a为空时不执行判断怎么办?好办得很嘛:
  1. if [ -n "$a" ] && [ "$a" != 0 -a "$b" == 0 ]; then
  2. echo "yes"
  3. fi
复制代码

这样就行了。-n表示存在(相反,-z表示不存在)。[ -n "$a" ]判断通过后才会执行&&后面的,否则就在这里终止。另外,上面的例子跟:
  1. if [ -n "$a" ] ; then
  2. if [ "$a" != 0 -a "$b" == 0 ]; then
  3.   echo "yes"
  4. fi
  5. fi
复制代码
意义是一样的,属于2重判断,而不是2条件判断。

题外话:a=1是赋予一个实际的值,那么要赋予一个空值呢? a=""就是赋予空值(本来a= 也是可以,但是避免歧义,要习惯使用"")。

题外话:[ "$b" == 0 ]与 [ "$b" = 0 ]有什么区别?使用==的是数值比较,比较的条件仅限于于数值(数值仅有数字,无空格等其它字符),使用=的是字符比较,比较的条件可以是任意字符。本来,最基本用法应该是这样:[ "$b" == “110” ]、[ "$b" = “ll0" ],即两边都用双引号,为何?因为双引号内所有字符才会被认为是一个整体,比如使用[ "$b" = ll 0 ],会直接报错,但使用[ "$b" = "ll 0" ]就毫无问题,条件判断这里所以要养成使用""的习惯。

题外话:[ "$b" == 0 ]与 [ "$b" = 0 ]这些”等于“的判断知道怎么用了,那么不等于呢?shell中没有不等于号定义,但是有取反符合定义”!"。[ "$b" == 0 ]与 [ "$b" != 0 ]有什么区别?两者都是数值比较,==与!=是一样的用法。当要作为字符比较不等于怎么办?可以这样:[ ! "$b" = "aa0" ],表示判断之后取反。而使用[ "$b" != "aa0" ]是不规范的。


但是有一个地方的变量不能使用"",就是:
while
do
xxx $a
done
这种循环语句,使用了多数会报错,但这里不是条件判断的使用范围了。


我的恩山、我的无线 The best wifi forum is right here.
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

有疑问请添加管理员QQ86788181|手机版|小黑屋|Archiver|恩山无线论坛(常州市恩山计算机开发有限公司版权所有) ( 苏ICP备05084872号 )

GMT+8, 2024-4-26 02:57

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

| 江苏省互联网有害信息举报中心 举报信箱:js12377 | @jischina.com.cn 举报电话:025-88802724 本站不良内容举报信箱:68610888@qq.com 举报电话:0519-86695797

快速回复 返回顶部 返回列表