shell编程之变量进阶
间接参数扩展
${!parameter}
上述语句中,被引用的参数不是PARAMETER自身,而是PARAMETER的值
示例1
2
3
4[gavin@localhost ~]$ temp='hello world'
[gavin@localhost ~]$ parameter=temp
[gavin@localhost ~]$ echo ${!parameter}
hello world # 被引用的变量是 temp
上述效果等同于如下命令1
2[gavin@localhost ~]$ eval echo \${$parameter}
hello world
变量名扩展
${!PREFIX*}
${!PREFIX@}
这种参数扩展将列出以字符串PREFIX开头的所有变量名
示例1
2
3
4
5[gavin@localhost ~]$ echo ${!BASH*}
BASH BASHOPTS BASHPID BASH_ALIASES BASH_ARGC BASH_ARGV BASH_CMDS BASH_COMMAND BASH_COMPLETION_COMPAT_DIR BASH_LINENO BASH_SOURCE BASH_SUBSHELL BASH_VERSINFO BASH_VERSION
[gavin@localhost ~]$ echo ${!BASH@}
BASH BASHOPTS BASHPID BASH_ALIASES BASH_ARGC BASH_ARGV BASH_CMDS BASH_COMMAND BASH_COMPLETION_COMPAT_DIR BASH_LINENO BASH_SOURCE BASH_SUBSHELL BASH_VERSINFO BASH_VERSION
大小写修改(bash 4.0 新特性)
${PARAMETER^}
:将变量的第一个字符改为大写${PARAMETER^^}
:将变量全部内容改为大写${PARAMETER,}
:将变量的第一个字符改为小写${PARAMETER,,}
:将变量全部内容改为小写${PARAMETER~}
:对变量中每个单词首字母大小写取反(单词之间根据空格划分)${PARAMETER~~}
:对变量内容大小写进行取反
示例1
2
3
4
5
6
7
8
9
10
11
12
13[gavin@localhost ~]$ var='hello world'
[gavin@localhost ~]$ echo ${var^} # 将变量的第一个字符改为大写
Hello world
[gavin@localhost ~]$ echo ${var^^} # 将变量全部内容改为大写
HELLO WORLD
[gavin@localhost ~]$ echo ${var,} # 将变量的第一个字符改为小写
hello world
[gavin@localhost ~]$ echo ${var,,} # 将变量全部内容改为小写
hello world
[gavin@localhost ~]$ echo ${var~} # 对变量中每个单词首字母大小写取反
Hello World
[gavin@localhost ~]$ echo ${var~~} # 对变量内容大小写进行取反
HELLO WORLD
字符串移除
${PARAMETER#PATTERN}
:从前至后,最短匹配移除${PARAMETER##PATTERN}
:从前至后,最长匹配移除${PARAMETER%PATTERN}
:从后往前,最短匹配移除${PARAMETER%%PATTERN}
:从后往前,最长匹配移除
记忆方式: #
键在前,所以从前至后; %
键在后,所以从后至前
示例1
2
3
4
5
6
7
8
9[gavin@localhost ~]$ file='/home/gavin/batch/script/file.txt'
[gavin@localhost ~]$ echo ${file#*/} # 从前向后最短匹配(*/)
home/gavin/batch/script/file.txt
[gavin@localhost ~]$ echo ${file##*/} # 从前向后最长匹配(*/)
file.txt
[gavin@localhost ~]$ echo ${file%/*} # 从后向前最短匹配(/*)
/home/gavin/batch/script
[gavin@localhost ~]$ echo ${file%%/*} # 从后向前最长匹配(/*)
# 变量字符串全部移除
字符串截取
${PARAMETER:OFFSET}
:从指定位置截取至末尾${PARAMETER:OFFSET:LENGTH}
:从指定位置截取指定长度
起始字符的索引从0开始计数。我们也可以从后向前计数,将最后一个字符索引记为 -1
如果使用负数作为索引值的话,必须将负数放入括号内,或者使用 0-n方式
示例1
2
3
4
5
6
7
8
9[gavin@localhost ~]$ var="This is a line of text"
[gavin@localhost ~]$ echo ${var:5}
is a line of text
[gavin@localhost ~]$ echo ${var:0:4}
This
[gavin@localhost ~]$ echo ${var:(-4)}
text
[gavin@localhost ~]$ echo ${var:0-4}
text
字符串删除与替换
${PARAMETER/PATTERN/STRING}
:替换第一个匹配的字符串${PARAMETER//PATTERN/STRING}
:替换所有匹配的字符串${PARAMETER/PATTERN}
:删除第一个匹配的字符串${PARAMETER//PATTERN}
:删除所有匹配的字符串
示例1
2
3
4
5
6
7
8
9[gavin@localhost ~]$ var=aabbcc
[gavin@localhost ~]$ echo ${var/a/A}
Aabbcc
[gavin@localhost ~]$ echo ${var//a/A}
AAbbcc
[gavin@localhost ~]$ echo ${var/a}
abbcc
[gavin@localhost ~]$ echo ${var//[a-z]} # 删除变量中所有的 a-z 字符
# 变量字符串全部删除
字符串长度
${#string}
获取变量字符穿长度
示例
1 | [gavin@localhost ~]$ var='啊AA' |
变量的测试与内容替换
变量设置方式 | str未定义 | str为空字串 | str已设置非为空字串 |
---|---|---|---|
var=${str-expr} | var=expr | var= | var=$str |
var=${str:-expr} | var=expr | var=expr | var=$str |
var=${str+expr} | var= | var=expr | var=expr |
var=${str:+expr} | var= | var= | var=expr |
var=${str=expr} | str=expr | str 不变 | str 不变 |
var=${str=expr} | var=expr | var= | var=$str |
var=${str:=expr} | str=expr | str=expr | str 不变 |
var=${str:=expr} | var=expr | var=expr | var=$str |
var=${str?expr} | expr 输出至 | stderr | var= var=$str |
var=${str:?expr} | expr 输出至 | stderr | expr 输出至 stderr var=$str |
示例1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32[gavin@localhost ~]$ unset null # 变量 null 未定义
[gavin@localhost ~]$ blank= # 变量 blank 为空串
[gavin@localhost ~]$ blank1='' # 变量 blank1 为空串
[gavin@localhost ~]$ var=string # 变量 var 设置为非空字串
[gavin@localhost ~]$ echo ${null-word}
word
[gavin@localhost ~]$ echo ${blank-word}
# 空串
[gavin@localhost ~]$ echo ${var-word}
string
[gavin@localhost ~]$ echo ${null:-word}
word
[gavin@localhost ~]$ echo ${blank:-word}
word
[gavin@localhost ~]$ echo ${var:-word}
string
[gavin@localhost ~]$ echo ${null+word}
# 空串
[gavin@localhost ~]$ echo ${blank+word}
word
[gavin@localhost ~]$ echo ${var+word}
word
[gavin@localhost ~]$ echo ${null:+word}
# 空串
[gavin@localhost ~]$ echo ${blank:+word}
# 空串
[gavin@localhost ~]$ echo ${var:+word}
word
参考
Linux Shell命令行及脚本编程实例详解 (第5章)
鸟哥的Linux私房菜 基础学习篇 (第10章)