Linux 字符串变量 星号,shell中变量被定义为星号(*)后无法引用的问题

在编写shell脚本的过程中,有的时候难免会用到一些变量值被定义为(*)的变量,但是当我们试图引用这个变量的时候bash有默认会把(*)替换成当前目录下的所有文件名的列表,如下:[root@vm_102 ~]# a=*

[root@vm_102 ~]# echo $a

anaconda-ks.cfg install.log install.log.syslog

[root@vm_102 ~]# ls

anaconda-ks.cfg  install.log  install.log.syslog

这个时候我们可以考虑一个问题:这里的(*)是在哪一步被替换成当前目录下面的文件列表的呢:是在第一步,变量赋值的时候就被替换的呢还是说,在echo变量值的时候被替换的呢?

事实是这样子的:

1、当变量复制的时候,bash会直接将(*)赋值给变量a;

2、但是在第二步引用变量的时候,bash默认会把(*)替换成当前目录下的所有文件的列表,大家可以这么实验一下:[root@vm_102 ~]# echo *

anaconda-ks.cfg install.log install.log.syslog

但是如何把变量a的值取出来呢,这个时候就把变量引用时引号的作用给体现出来了:

当我们引用变量时,无引号、单引号、双引号的区别:()[root@vm_102 ~]# echo "$a"                #将引号里面的变量替换成相对应变量值

*

[root@vm_102 ~]# echo '$a'

$a                                        #将引号里面的字符统统不做转义,全部按字符串输出

后面的问题接踵而至,当我想要在shell脚本中使用if语句判断某个变量的变量值是否为(*)的时候有报错了:[root@vm_102 ~]# [[ "$a" -eq * ]] && echo aa || echo bb

-bash: [[: *: syntax error: operand expected (error token is "*")

bb

于是想了一下,会不会是(*)没加双引号的原因呢:[root@vm_102 ~]# [[ "$a" -eq "*" ]] && echo aa || echo bb

-bash: [[: *: syntax error: operand expected (error token is "*")

bb

好吧,不行的,那把(-eq)换成(==)试下:[root@vm_102 ~]# [[ "$a" == "*" ]] && echo aa || echo bb

aa

[root@vm_102 ~]# [[ "$a" == * ]] && echo aa || echo bb

aa

[root@vm_102 ~]# [[ $a == "*" ]] && echo aa || echo bb

aa

[root@vm_102 ~]# [[ $a == * ]] && echo aa || echo bb

aa

大家可能会奇怪,为什么最后一条都没加引号也是可以的呢,这里我们可以再做一个实验看下:

我们将当前目录下的所有文件名的列表作为变量值赋给c[root@vm_102 ~]# echo $a

anaconda-ks.cfg install.log install.log.syslog

[root@vm_102 ~]# c="anaconda-ks.cfg install.log install.log.syslog"

[root@vm_102 ~]# [[ "$c" == * ]] && echo aa || echo bb

aa

[root@vm_102 ~]# [[ "$c" == "*" ]] && echo aa || echo bb

bb

这个时候我们可以看到出,当两边都不加双引号的时候,(==)两边都是当前目录下的所有文件的列表作为变量值来进行比较,最后也是相等的;

但是当一边加引号、一边不加的时候为什么也相等,暂时还解释不了,如果各位知道为什么,麻烦在下方的评论区告知一下,不胜感激。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值