变量子串
${var} 返回变量var的内容,单独使用时有没有{}一样,混合多个变量和常量时,用{}界定变量名
${#var} 返回变量var内容的长度
${var:offset} 从变量var中的偏移量offset开始截取到字符串结尾的子字符串,offset从0开始
${var:offset:length} 从变量var中的偏移量offset开始截取长度为length的子字符串
${var#*.} 从变量var中删除第一个匹配的点(.)及其左边的所有字符
${var##*.} 从变量var中删除最后一个匹配的点(.)及其左边的所有字符
${var%.*} 从变量var中删除最后一个匹配的点(.)及其右边的所有字符
${var%%.*} 从变量var中删除第一个匹配的点(.)及其右边的所有字符
示例:
1var=file.txt.tar.gz
2${var#*.} #内容为"txt.tar.gz"
3${var##*.} #内容为"gz"
4${var%.*} #内容为"file.txt.tar"
5${var%%.*} #内容为"file"
也可以使用其它Pattern和表达式,示例:
1var=/home/xxx/aaa/file.txt #假设xxx为当前用户
2
3# 从路径中获取文件名
4${var##*/} #内容为"file.txt"
5
6# 将绝对路径转为相对路径
7# whoami是获取当前用户名,使用$()执行子shell,$(whoami)将得到xxx
8~${var#*$(whoami)} #内容为"~/aaa/file.txt"
${var/pattern/string} 使用string代替第一个匹配的pattern
${var//pattern/string} 使用string代替所有匹配的pattern
${var,} 首字母转小写
${var,,} 全部转小写
${var^} 首字母转大写
${var^^} 全部转大写
特殊扩展变量
${var-word} 如果变量var未赋值,则返回字符串word
${var:-word} 如果变量var未赋值或者值为空,则返回字符串word
${var+word} 如果变量var有值(包括空串""),则返回字符串word
1var1=foo
2var2=
3${var1-word} # 内容为"foo"
4echo ${var2-word} # 内容为""
5echo ${var2:-word} # 内容为"word"
${var:+word} 如果变量var有值且不为空,则返回字符串word
${var=word} 如果变量var未赋值,则返回字符串word,并为var赋值为字符串word
${var:=word} 如果变量var未赋值或者值为空串,则返回字符串word,并为var赋值为字符串word
${var?word} 如果变量var未赋值,将字符串word作为标准错误输出,否则返回变量var的值
${var:?word} 如果变量var未赋值或者值为空串,将字符串word作为标准错误输出,否则返回变量var的值
数组
array=(1 2 3 a b c) 定义一个名为array的数组,包含了6个元素,元素字段类型不需要统一
${array[index]} 访问数组中的元素,index从0开始,如果为负表示从数组的末尾开始的偏移量
${array[*]} 获取数组中所有元素
${array[@]} 获取数组中所有元素
${#array[*]} 获取数组的长度
${#array[@]} 获取数组的长度
${!array[@]} 获取数组索引列表,返回 0 1 2 3 4 5
array+=(4 d) 向数组中添加元素,数组内容为 1 2 3 a b c 4 d
unset array[6] 删除第 7 个元素,数组内容为 1 2 3 a b c d
unset array[-1] 删除倒数第 1 个元素,数组内容为 1 2 3 a b c
多行字符串变量
1var=$(cat <<- 'EOF'
2line1
3line2
4...
5EOF)
或者使用单引号或者双引号(单引号中${}和$()等都不会取表达式的值,双引号中才会):
1var='line1
2line2
3...'
注意上述两种写法的差别,避免为变量内容带来不必要的空行。通过循环可依次得到变量中的每一行:
1while read -r line; do
2echo $line
3done <<< $var
Shell系统变量
$1 表示第一个参数,$2 表示第二个参数 …
$# 命令行参数的个数
$0 当前Shell脚本程序的名称
$? 前一个命令或函数的返回码
$* 以 “参数1 参数2 … " 形式获取所有参数
$@ 以 “参数1” “参数2” … 形式获取所有参数
$$ 本程序的进程ID,即PID
$! 上一个命令的PID
$PPID 父进程的PID
$UID 执行这个脚本的当前用户ID
变量输出
变量内容的输出使用 echo 命令。
如果未使用 echo,则会将变量内容当成 Shell 命令来执行,常用于调用某个程序并传递参数,如:应用程序启动脚本。