Shell中变量、字符串、数组、参数的技巧

变量子串

${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 命令来执行,常用于调用某个程序并传递参数,如:应用程序启动脚本。


Librenms使用ldap认证用户
KVM网络如何设置DHCP
comments powered by Disqus