06 Shell Script特殊变量和模式匹配
Shell Script特殊变量和模式匹配
一、Shell Script特殊变量
| 变量 | 含义 | 
|---|---|
| $0 | 当前脚本的文件名 | 
| $n | 传递给脚本或函数的参数。n是一个数字,表示第几个参数。例如,第一个参数是$1,第二个参数是$2。 | 
| $# | 传递给脚本或函数的个数 | 
| $* | 传递给脚本或函数的所有函数 | 
| $@ | 传递给脚本或函数的所有参数。被双引号(”")包含时,与$*稍有不同,下面将会讲到。 | 
| $? | 上个命令的退出状态,或函数的返回值。 | 
| $$ | 当前Shell进程ID。对于Shell 脚本,就是这些脚本所在的进程ID。 | 
 举例:
# 创建sh脚本
[root@localhost ~]# vi myshell.sh  # 写入内容
#!/bin/bashecho "sh脚本文件名为:$0"
echo "收到的第一个参数为:$1"
echo "共接收到$#个参数"
id host
echo "获取host的id(是否非0):$?"
echo "当前shell进程ID:$$"# 运行结果
[root@localhost ~]# bash myshell.sh a b c
sh脚本文件名为:myshell.sh
收到的第一个参数为:a
共接收到3个参数
id: host: no such user
获取host的id:1
当前shell进程ID:1575
二、shell的模式匹配
 通配符
 ?:匹配单个任意字符
 * :匹配0到多个任意字符
 [] :匹配中括号内规定的单个字符
 shell自身有能力辨别通配符
 模式匹配中还有正则表达式,需要用户空间程序自身来处理
 发生在路径扩展中的模式匹配(通配符)
# 创建几个文件
[root@localhost ~]# touch aa abc ac a1 a2 a3# 查看
[root@localhost ~]# ls
a1  a2  a3  aa  abc  ac  myshell.sh# 查看a开头,后面跟一个字符的
[root@localhost ~]# ls a?  
a1  a2  a3  aa  ac# 查看所有以a开头的文件
[root@localhost ~]# ls a*
a1  a2  a3  aa  abc  ac# 查看以a1-a3的文件
[root@localhost ~]# ls a[1-3]
a1  a2  a3
三、shell的模式匹配在变量中的应用
 变量取值过程中可以加入模式匹配
 从右边开始匹配并删除最小的匹配后缀:${变量%匹配规则}
 从右边开始匹配并删除最大的匹配后缀:${变量%%匹配规则}
 从左边开始匹配并删除最小的匹配前缀:${变量#匹配规则}
 从左边开始匹配并删除最大的匹配前缀:${变量##匹配规则}
# 创建sh文件
[root@localhost ~]# vi myshell.sh   # 写入内容
#!/bin/bash
file=/opt/myfile/abc.txt
# 获取除后缀外的文件路径
filePath=${file%.*}
echo "$filePath"
# 获取文件名
echo "${file##/*/}"
# 获取文件后缀
echo "${file#/*.}"
# 获取文件名(不含后缀)
echo "${filePath##/*/}"# 运行结果
[root@localhost ~]# bash myshell.sh 
/opt/myfile/abc
abc.txt
txt
abc
 只有在匹配规则中使用了*匹配符号时,%和%%,#和##才有区别
