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
只有在匹配规则中使用了*匹配符号时,%和%%,#和##才有区别