参数展开是shell变量在程序中使用的过程。在shell中变量使用$varname 来引用变量。
变量名称可以括在花括号里(${variable}),括号里面可以增加一些额外语法,执行额外功能。
替换运算符(:)
运算符(:)是可选的,如果省略冒号,则将每个定义中的‘存在且非null' 修改为 ’存在‘
运算符 用途 说明 ${varname:-default} 如果变量未定义,则返回默认值 如果varname存在且非null,则返回其值;否则返回default默认值 ${varname:=default} 如果变量未定义,则设置为默认值 如果varname存在且非null,则返回其值;否则设置变量为default,并返回其值 ${varname:?msg} 为了捕捉由于变量未定义所导致的错误,显示提示信息 如果varname存在且非null,则返回其值;否则显示varname:msg,并退出当前的命令或者脚本。省略msg,会显示默认信息‘parameter null or not set’。
交互式shell不需要退出
${varname:+msg} 为测试变量的存在 如果varname存在且非null,则返回msg;否则返回null
模式匹配运算符(# %)
# 从开头开始匹配
% 从尾部开始匹配
eg: path=/home/tost/mem/long.file.name
运算符 用途 说明 ${varname#pattern} 从变量值的开头处匹配,则删除匹配的最短部分,并返回剩下的部分 例:${path#/*/},返回 tost/mem/long.file.name ${varname##pattern} 变量开头处匹配,匹配最长部分,并返回剩下部分 例:${path##/*/},返回 long.file.name ${varname%pattern} 变量尾部匹配,匹配最短部分,并返回剩下部分 例:${path%.*},返回 /home/tost/mem/long.file ${varname%%pattern}
变量尾部匹配,匹配最长部分,并返回剩下部分
例:${path%%.*},返回 /home/tost/mem/long
位置参数(positional parameter)
shell脚本的命令行参数,也表示shell函数内的函数参数。
位置参数名称以单个整数来命名,当这个整数大于9时,使用花括号{}括起来。
变量 | 说明 |
$# | 传递给shell脚本或函数的参数总数 |
$* $@ | 一次表示所有的命令行参数 |
“$*” | 将所有命令行中参数视为单个字符串。等同于“ $1 $2 $3 ...” |
"$@" | 将所有命令行参数的每个视为单独字符串。等同于 “$1” "$2" "$3" |
特殊参数
POSIX 内置Shell变量
变量 | 说明 |
# | 目前参数个数 |
@ | 传递给当前进程的命令行参数,在双引号内,每个参数会生成一个字符串 |
* | 传递给当前进程的命令行参数,双引号内,所有参数生成一个字符串 |
-(连字号) | shell选项 |
? | 前一个命令的退出状态 |
$ | shell程序的名称 |
0(零) | shell程序名称 |
! | 最近一个后台命令的进程编号,可通过wait命令以供稍后使用 |
ENV | 一旦引用,则仅用于交互式Shell中,$ENV的值是可展开的参数。结果应为要读取和在启动时要要执行的一个文件的完整路径名称。这是一个XSI必需的变量 |
HOME | 用户根登陆目录 |
IFS | 内部的字段分隔符 |
LANG | locale默认值,其他LC_*变量会覆盖其值 |
LC_ALL | 当前locale的名称;会覆盖LANG与其他LC_*变量 |
LC_COLLATE | 用来排序字符的当前locale名称 |
LC_CTYPE | 模式匹配期间,字符类别的当前locale |
LC_MESSAGES | 当前语言的名称 |
LINENO | 刚执行过的函数或者脚本内的行编号 |
NLSPATH | 在$LC_MESSAGES(XSI)所给定的信息语言里,信息目录的位置 |
PATH | |
PPID | 父进程的进程编号 |
PS1 | 主要命令提示字符串,默认为 $ |
PS2 | 行继续提示字符串 默认 > |
PS4 | 以set -x 设置的执行跟踪的提示字符串 默认 + |
PWD | 当前工作目录 |