shell中变量被定义为星号(*)后无法引用的问题
2014-12-09 19:38
609 查看
在编写shell脚本的过程中,有的时候难免会用到一些变量值被定义为(*)的变量,但是当我们试图引用这个变量的时候bash有默认会把(*)替换成当前目录下的所有文件名的列表,如下:
事实是这样子的:
1、当变量复制的时候,bash会直接将(*)赋值给变量a;
2、但是在第二步引用变量的时候,bash默认会把(*)替换成当前目录下的所有文件的列表,大家可以这么实验一下:
当我们引用变量时,无引号、单引号、双引号的区别:()
我们将当前目录下的所有文件名的列表作为变量值赋给c
但是当一边加引号、一边不加的时候为什么也相等,暂时还解释不了,如果各位知道为什么,麻烦在下方的评论区告知一下,不胜感激。
本文出自 “红楼遗梦” 博客,请务必保留此出处http://leidongya.blog.51cto.com/7375845/1588056
[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这个时候我们可以看到出,当两边都不加双引号的时候,(==)两边都是当前目录下的所有文件的列表作为变量值来进行比较,最后也是相等的;
但是当一边加引号、一边不加的时候为什么也相等,暂时还解释不了,如果各位知道为什么,麻烦在下方的评论区告知一下,不胜感激。
本文出自 “红楼遗梦” 博客,请务必保留此出处http://leidongya.blog.51cto.com/7375845/1588056
相关文章推荐
- C#变量初始化问题:字段初始值无法引用非静态字段、方法或属性
- shell 间接变量引用的问题
- 如何定义和引用shell中的变量
- 对于AWK中引用SHELL中的变量问题
- linux脚本明明定义了变量,但是引用的时候报错(原因:shell定义变量的时候,“等号”两边不要加空格)
- CLR中函数引用传递无法使用ref class成员变量的问题
- Shell变量的定义与引用
- 问题(怎样在dephi中引用.net中定义的类.方法参数,参数类型为XMLdocument?我要调用此方法并把实例花的xmldocument类型的变量作为参数给它。)
- shell 间接变量引用的问题
- shell 间接变量引用的问题
- [C#]变量初始化问题:字段初始值无法引用非静态字段、方法或属性
- C/C++全局变量的定义与引用问题
- 关于方法内定义的类引用局部变量需要将变量设置final的问题
- C#变量初始化问题:字段初始值无法引用非静态字段、方法或属性
- Shell脚本定义变量和环境变量的引用
- 管道下while循环中定义的变量在退出while循环时引用为空的问题
- 【Android调试】一招搞定“R.Java文件误删,新定义的Layout无法被R.Layout引用”问题
- shell定义带变量的模板,直接修改变量,用这种方法再也不用担心正则匹配不准的问题了
- 对于SED中引用SHELL中的变量问题
- Windows 环境变量的引用顺序问题导致无法解析