shell脚本中关于大括号的特殊用法

shell脚本中大括号的特殊用法

${#VARNAME} 获取变量的长度
[root@mysqlserver01 ~]# echo ${#var_name} #var_name是未定义的变量
0
[root@mysqlserver01 ~]# var_name=“abcd”
[root@mysqlserver01 ~]# echo ${#var_name}
4

${VARNAME#.} 删除第一个.以及它之前的内容,就是保留第一个.后面的内容。.是可以 用任意字符替换
[root@mysqlserver01 ~]# dir_path=“123/opt/abc/f1.txt”
[root@mysqlserver01 ~]# echo ${dir_path#
/}
opt/abc/f1.txt
[root@mysqlserver01 ~]# dir_path=“aaa/opt/abc/f1.txt”
[root@mysqlserver01 ~]# echo ${dir_path#*/}
opt/abc/f1.txt

${VARNAME##.} 删除最后一个.以及它之前的内容,就是保留最后一个.后面的内容。
[root@mysqlserver01 ~]# dir_path=“aaa/opt/abc/f1.txt”
[root@mysqlserver01 ~]# echo ${dir_path##
/}
f1.txt

${VARNAME%.} 删除最后一个.以及它之后的内容,就是保留最后一个.前面的内容。
[root@mysqlserver01 ~]# dir_path=“aaa/opt/abc/f1.txt”
[root@mysqlserver01 ~]# echo ${dir_path%/
}
aaa/opt/abc

${VARNAME%%.} 删除第一个.以及它之后的内容,就是保留第一个.前面的内容。
[root@mysqlserver01 ~]# dir_path=“aaa/opt/abc/f1.txt”
[root@mysqlserver01 ~]# echo ${dir_path%%/
}
aaa

${VARNAME/OLD/NEW} 将变量中的第一个OLD替换成NEW
[root@mysqlserver01 ~]# dir_path=“aaa/opt/abc/f1.txt”
[root@mysqlserver01 ~]# echo ${dir_path/a/A}
Aaa/opt/abc/f1.txt

${VARNAME//OLD/NEW} 将变量中的所有OLD替换成NEW
[root@mysqlserver01 ~]# dir_path=“aaa/opt/abc/f1.txt”
[root@mysqlserver01 ~]# echo ${dir_path//a/A}
AAA/opt/Abc/f1.txt
补充:“*”表示通配符,用于匹配字符串将被删除的字串。“.”表示字符串中分隔符,可以为任意一个或多个字符。“%”表示从右向左匹配,“#”表示从左向右匹配,“/”表示替换,都属于非贪婪匹配,即匹配符合通配符的最短结果。与“%”、“#”和“/”类似的有“%%”、“##”和“//”,都属于贪婪匹配,即匹配符合通配符的最长结果。

${VARNAME:OFFSET} 删除变量的前面的OFFSET个字符 注:OFFSET是指数字
[root@mysqlserver01 ~]# dir_path=“aaa/opt/abc/f1.txt”
[root@mysqlserver01 ~]# echo ${dir_path:2}
a/opt/abc/f1.txt
[root@mysqlserver01 ~]# echo ${dir_path:3}
/opt/abc/f1.txt

${VARNAME:OFFSET:LENGTH} 跳过变量的前面的OFFSET个字符,获取LENGTH个字符。
[root@mysqlserver01 ~]# dir_path=“aaa/opt/abc/f1.txt”
[root@mysqlserver01 ~]# echo ${dir_path:3:5}
/opt/
[root@mysqlserver01 ~]# echo ${dir_path:5:3}
pt/

${VARNAME:0-OFFSET} 获取变量最后OFFSET个字符
[root@mysqlserver01 ~]# dir_path=“aaa/opt/abc/f1.txt”
[root@mysqlserver01 ~]# echo ${dir_path:0-3}
txt

${VARNAME:0-OFFSET:LENGTH} 获取变量最后OFFSET个字符中的前LENGTH个字符
注意:OFFSET>LENGTH
[root@mysqlserver01 ~]# dir_path=“aaa/opt/abc/f1.txt”
[root@mysqlserver01 ~]# echo ${dir_path:0-3:5}
txt
[root@mysqlserver01 ~]# echo ${dir_path:0-5:3}
1.t
[root@mysqlserver01 ~]# echo ${dir_path:0-5:5}
1.txt
[root@mysqlserver01 ~]# echo ${dir_path:0-5}
1.txt

${VARNAME:-WORD} 如果变量值为空或者变量未定义,就会用WORD来替换。
[root@S1 ~]# set | grep “^abc=” # set获取所有变量
[root@S1 ~]# echo ${abc:-hello}
hello #但是abc仍然没有定义,echo ${abc}输出为空
[root@S1 ~]# abc=
[root@S1 ~]# echo ${abc:-hello}
hello

${VARNAME:=WORD} 如果变量值为空,就会重新赋值为WORD。如果变量未定义,就会定义变量并且赋值为WORD。否则没有任何变化。
[root@centos6 ~]# echo $var100

[root@centos6 ~]# set | grep var100
[root@centos6 ~]#
[root@centos6 ~]# echo ${var100:=123}
123
[root@centos6 ~]# set | grep var100
var100=123
[root@centos6 ~]# echo ${var100:=456}
123
[root@centos6 ~]# set | grep var100
var100=123
[root@centos6 ~]# var100=
[root@centos6 ~]# echo ${var100:=456}
456

${VARNAME:+WORD}
如果变量已定义并且已赋值,就会返回WORD。否则没有任何变化。

[root@centos6 ~]# echo $var200

[root@centos6 ~]# set | grep var200
[root@centos6 ~]# echo ${var200:+123}

[root@centos6 ~]# var200=
[root@centos6 ~]# echo ${var200:+123}

[root@centos6 ~]# var200=abc
[root@centos6 ~]# echo ${var200:+123}
123
[root@centos6 ~]# echo $var200
abc

${VARNAME?} 判断变量是否已定义,如果未定义,会报错。
[root@S1 ~]# abc=
[root@S1 ~]# echo ${abc:-hello}
hello
[root@S1 ~]# echo ${abc?}

[root@S1 ~]# set | grep “^aaa=”
[root@S1 ~]# echo ${aaa?}
-bash: aaa: parameter null or not set

${VARNAME:?MESSAGE} 如果变量未定义或者未赋值,就会报错并且报错信息修改为MESSAGE。(默认的报错信息是parameter null or not set)
[root@centos6 ~]# echo $var300

[root@centos6 ~]# set | grep var300
[root@centos6 ~]# echo ${var300:?}
-bash: var300: parameter null or not set
[root@centos6 ~]# echo ${var300:?error}
-bash: var300: error
[root@centos6 ~]# var300=
[root@centos6 ~]# echo ${var300:?}
-bash: var300: parameter null or not set

[root@mysqlserver01 tmp]# error_var=“error”
[root@mysqlserver01 tmp]# echo KaTeX parse error: Expected '}', got 'EOF' at end of input: {aaaaaa:?{error_var}} #冒号后边也可以使用变量
-bash: aaaaaa: error
[root@mysqlserver01 tmp]# error_var=“failed”
[root@mysqlserver01 tmp]# echo KaTeX parse error: Expected '}', got 'EOF' at end of input: {aaaaaa:?{error_var}}
-bash: aaaaaa: failed

V A R N A M E : ? M E S S A G E {VARNAME:?MESSAGE}和 {VARNAME?MESSAGE}的区别:
${VARNAME?MESSAGE} 当未定义变量VARNAME,则会报错
${VARNAME:?MESSAGE} 当未定义变量VARNAME或者变量VARNAME的值为空,才会报错
[root@mysqlserver01 ~]#
[root@mysqlserver01 ~]# echo ${a?}
-bash: a: parameter null or not set
[root@mysqlserver01 ~]# a=
[root@mysqlserver01 ~]# echo ${a?}

[root@mysqlserver01 ~]# echo ${a:?}
-bash: a: parameter null or not set
[root@mysqlserver01 ~]# echo ${b:?}
-bash: b: parameter null or not set

补充:WORD可以为一个字符串,也可以为一个变量。当为变量时,需要用“$”引用该变量。

猜你喜欢

转载自blog.csdn.net/qq_43028054/article/details/93137402