Title here
Summary here
在 Bash 中,参数展开是一种用于操作和处理变量内容的机制。 通过参数展开,可以获取变量的值,修改变量的值,或者为未设置的变量提供默认值。
Shell 参数展开
最常见的方式。
var="Bash"
echo "Hello, ${var}!"
${var+DEFAULT}
unset var
echo ${var+foo}
var=
echo ${var+foo}
foo
可以用这个标记来判断变量是否未定义。
#!/usr/bin/env bash
if [ -n "${var+defined}" ]; then
echo "var already defined"
else
echo "var not defined"
fi
注意
如果 ${var+defined}
没有使用双引号,当返回空字符串的时候,条件就会变成 [ -n ]
,
这是一个有效的条件,不会产生任何错误,且它的返回值为真。显然这是不合理的,因此必须添加双引号。
${var-DEFAULT}
unset var
echo ${var-foo}
foo
var=
echo ${var-foo}
var 和 DEFAULT 的值有可能相同,因此不能用来判断 var 是否被定义。
${var:+DEFAULT}
var=abc
echo ${var:+foo}
foo
${var:-DEFAULT}
unset var
echo ${var:-foo}
var=
echo ${var:-foo}
上面的两个例子都会输出 foo。
unset var
echo ${var:=foo}
echo $var
foo
foo
var="heybro!"
echo ${var:3:4}
bro!
var="heybro!"
echo ${#var}
7
删除最短匹配:用 #
,模式 */
。
var="a/b/c"
echo ${var#*/}
b/c
删除最长匹配:用 ##
,模式 */
。
var="a/b/c"
echo ${var##*/}
c
删除最短匹配:用 %
,模式 /*
。
var="a/b/c"
echo ${var%/*}
a/b
删除最长匹配:用 %%
,模式 /*
。
var="a/b/c"
echo ${var%%/*}
a
var="aa bb aa"
echo ${var/aa/cc}
cc bb aa
var="aa bb aa"
echo ${var//aa/cc}
cc bb cc