相信正在脚本之路上狂奔的同学们,都能感觉到脚本中需要应用变量的地方非常广泛,简单来看变量也只不过就是:var=value;如果我们深入其中,也能发现变量里面的学问其实也挺深的,今天就给大家分享一下这个小小的变量里面到底有多少的学问吧。Shell变量一般是无类型的,但是bash Shell提供了declare和typeset两个命令用于指定变量的类型,两个命令是完全等价的。
一、高级变量用法——定义有类型变量
declare [选项] 变量名
-r 将变量设置为只读属性 等同于使用export VAR_NAME
-i 将变量定义为整型数
-a 将变量定义为数组
-f 显示此脚本前定义过的所有函数名及其内容
-F 仅显示此脚本前定义过的所有函数名
-x 将变量声明为环境变量
-l 将变量值转为小写字母
-u 将变量值转为大写字母
二、字符串切片:
1、${#var}:返回字符串变量var的长度
示例代码:
[[email protected] array]# vara=test12345
[[email protected] array]# echo ${vara}
test12345
[[email protected] array]# echo ${#vara}
9
2、${var:offset}:返回字符串变量var中从第offset个字符后(不包括第offset个字符)的字符开始,到最后的部分,offset的取值在0 到 ${#var}-1 之间
(bash4.2后,充许为负值)
示例代码:
[[email protected] array]# vara=test12345
[[email protected] array]# echo ${vara:4}
12345
3、${var:offset:number}:返回字符串变量var中从第offset个字符后(不包括第offset个字符)的字符开始,长度为number的部分
示例代码:
[[email protected] array]# vara=test12345
[[email protected] array]# echo ${vara:3:4}
t123
4、${var: -lengh}:取字符串的最右侧几个字符
注意:冒号后必须有一空白字符
示例代码:
[[email protected] array]# vara=test12345
[[email protected] array]# echo ${vara: -3}
345
[[email protected] array]# echo ${vara: -5}
12345
三、字符串处理
(一)基于模式取子串:
1、${var#*word}:自左而右,查找var变量所存储的字符串中,第一次出现的word, 删除字符串开头至第一次出现word字符之间的所有字符
示例代码:
[[email protected] array]# vara=test12345
[[email protected] array]# echo ${vara#*12}
345
[[email protected] array]# echo ${vara#*es}
t12345
2、${var##*word}:同上,不同的是,删除的是字符串开头至最后一次由word指定的字符之间的所有内容
示例代码:
[[email protected] array]# file=/var/log/messages
[[email protected] array]# echo ${file##*/}
messages
3、${var%word*}:自右而左,查找var变量所存储的字符串中,第一次出现的word, 删除字符串最后一个字符向左至第一次出现word字符之间的所有字符
示例代码:
[[email protected] array]# file=/var/log/messages
[[email protected] array]# echo ${file%/*}
/var/log
4、${var%%word*}:同上,只不过删除字符串最右侧的字符向左至最后一次出现word字符之间的所有字符
示例代码:
[[email protected] array]# url=http://www.baidu.com:80
[[email protected] array]# echo ${url##*:}
80
[[email protected] array]# echo ${url%%:*}
http
(二)查找替换:
1、${var/pattern/substi}:查找var所表示的字符串中,第一次被pattern所匹配到的字符串,以substi替换之
示例代码:
[[email protected] array]# vara=test12345test
[[email protected] array]# echo ${vara/es/00}
t00t12345test
2、${var//pattern/substi}: 查找var所表示的字符串中,所有能被pattern所匹配到的字符串,以substi替换之
示例代码:
[[email protected] array]# vara=test12345test
[[email protected] array]# echo ${vara/es/00}
t00t12345test
[[email protected] array]# echo ${vara//es/00}
t00t12345t00t
3、${var/#pattern/substi}:查找var所表示的字符串中,行首被pattern所匹配到的字符串,以substi替换之
示例代码:
[[email protected] array]# vara=test12345test
[[email protected] array]# echo ${vara/#te/00}
00st12345test
4、${var/%pattern/substi}:查找var所表示的字符串中,行尾被pattern所匹配到的字符串,以substi替换之
示例代码:
[[email protected] array]# vara=test12345test
[[email protected] array]# echo ${vara/#te/00}
00st12345test
[[email protected] array]# echo ${vara/%st/000}
test12345te000
(三)查找并删除:
1、${var/pattern}:查找var所表示的字符串中,删除第一次被pattern所匹配到的字符串
示例代码:
[[email protected] array]# vara=test12345test
[[email protected] array]# echo ${vara/12345}
testtest
2、${var//pattern}:查找var所表示的字符串中,删除所有被pattern所匹配到的字符串
示例代码:
[[email protected] array]# vara=test12345test
[[email protected] array]# echo ${vara//t}
es12345es
[[email protected] array]# file=/var/log/messages
[[email protected] array]# echo ${file///}
varlogmessages
3、${var/#pattern}:查找var所表示的字符串中,删除行首被pattern所匹配到的字符串
示例代码:
[[email protected] array]# vara=test12345test
[[email protected] array]# echo ${vara/#test}
12345test
[[email protected] array]# file=/var/log/messages
[[email protected] array]# echo ${file/#\/var}
/log/messages
4、${var/%pattern}:查找var所表示的字符串中,删除行尾被pattern所匹配到的字符串
示例代码:
[[email protected] array]# file=/var/log/messages
[[email protected] array]# echo ${file/%ges}
/var/log/messa
[[email protected] array]# vara=test12345test
[[email protected] array]# echo ${vara/%test}
test12345
(四)字符大小写转换:
1、${var^^}:把var中的所有小写字母转换为大写
示例代码:
[[email protected] array]# vara=test
[[email protected] array]# echo ${vara^^}
TEST
2、${var,,}:把var中的所有大写字母转换为小写
示例代码:
[[email protected] array]# vara=WANGJUN
[[email protected] array]# echo ${vara,,}
wangjun
四、变量赋值高级方式
1、${var:-value}:如果var为空或未设置,那么返回value;否则,则返回var的值
示例代码:
[[email protected] array]# echo ${varb:-100}
100
2、${var:+value}:如果var不空,则返回value
示例代码:
[[email protected] array]# varb=wangjun
[[email protected] array]# echo ${varb:+100}
100
3、${var:=value}:如果var为空或未设置,那么返回value,并将value赋值给var;否则,则返回var的值
示例代码:
[[email protected] array]# varb=wangjun
[[email protected] array]# echo ${varb:=100}
wangjun
[[email protected] array]# echo ${varc:=100}
100
4、${var:?error_info}:如果var为空或未设置,那么返回error_info;否则,则返回var的值
示例代码:
[[email protected] array]# varb=wangjun
[[email protected] array]# echo ${varb:?4}
wangjun
[[email protected] array]# echo ${vard:?4}
-bash: vard: 4
使用配置文件为脚本程序变量赋值
(1) 定义文本文件,每行定义“name=value”
(2) 在脚本中source此文件即可
五、间接变量引用
如果第一个变量的值是第二个变量的名字,从第一个变量引用第二个变量的值就称为间接变量引用
var1=var2
var2=value
var1的值是var2,而var2又是变量名,var2的值为value,间接变量引用是指通过var1获得变量值value的行为
bash Shell提供了两种格式实现间接变量引用
eval var3=\$$var1
var3=${!var1}
示例代码:
[[email protected] useradmin]# var1=user
[[email protected] useradmin]# user=test
[[email protected] useradmin]# echo $var1
user
[[email protected] useradmin]# eval var3=\$$var1
[[email protected] useradmin]# echo $var3
test
[[email protected] useradmin]# var4=${!var1}
[[email protected] useradmin]# echo $var4
test
eval命令
eval命令将会首先扫描命令行进行所有的置换,然后再执行该命令。该命令适用于那些一次扫描无法实现其功能的变量。该命令对变量进行两次扫描
示例代码:
[[email protected] useradmin]# prefix=user
[[email protected] useradmin]# $num
bash: 005: command not found...
[[email protected] useradmin]# num=005
[[email protected] useradmin]# eval "echo $prefix{001..$num}"
user001 user002 user003 user004 user005
正在学习脚本的同学们,当你看到这儿的同时,有什么想法吗,相信曾经的困惑被打开了吧,至少当初我自己学到这儿的时候,豁然开朗。