Shell编程 — 变量进阶

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
2
3
[gavin@localhost ~]$ var='啊AA'
[gavin@localhost ~]$ echo ${#var}
3

变量的测试与内容替换

变量设置方式 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章)