字符串切片
语法如下:
${variable_name:start_position:length}
指定字符串的起始位置及长度进行切片操作。
示例如下:
$ string=abcdefghijklmnopqrstuvwxyz
$ echo ${string:4}
efghijklmnopqrstuvwxyz
注意:起始字符的索引从0开始计数。这点和python相同,上面的示例是从第五个字符开始,打印到字符结束 。如果后面指定长度结果如下:
$ echo ${string:4:8}
efghijkl
从第五个字符开始,打印8个字符。
同python一样,其也支持后向切片,即索引标记为负值。这里和python不同的是,负值必须放在括号内,如下:
echo ${string:(-1)}
z
echo ${string:(-2):2}
yz
如果不加括号,也可以按下面这种写法来用:
echo ${string:0-1}
z
echo ${string:0-2:2}
yz
字符串截取
截取字符串的方法有如下几种:
${#parameter}获得字符串的长度
# $ % 键盘上#号在$号(左边),所有使用#号时表示从前面(左边)开始删除匹配的字段值,使用%表示从后面(右边)开始删除匹配的字段值
${parameter%word} 最小限度从后面删除匹配到的字符word 【最小限度指:从后面开始匹配直到匹配的第一个为止】
${parameter%%word} 最大限度从后面删除匹配到的字符word 【最大限度指:从后面开始匹配直到匹配的最后一个为止】
${parameter#word} 最小限度从前面删除匹配到的字符word 【最小限度指:从前面开始匹配直到匹配的第一个为止】
${parameter##word} 最大限度从前面删除匹配到的字符word 【最大限度指:从前面开始匹配直到匹配的最后一个为止】
示例执行结果如下:
var=http://www.361way.com/donate
echo ${#var}
输出结果:28
echo ${var%/}
输出结果:http://www.361way.com/donate
echo ${var%/*}
输出结果:http://www.361way.com
echo ${var%don}
输出结果:http://www.361way.com/donate
echo ${var%don*}
输出结果:http://www.361way.com/
echo ${var%on*}
输出结果:http://www.361way.com/d
echo ${var%%on*}
输出结果:http://www.361way.com/d
echo ${var%%361way*}
输出结果:http://www.
echo ${var##*/}
输出结果:donate
echo ${var##/*}
输出结果:http://www.361way.com/donate
echo ${var#*/}
/www.361way.com/donate
记住这里*星号是必须的,不能省略。不然取到的是完整值。
默认值获取
这里还有一个不太经常用到的高级用法,用于获取默认值。
${parameter:-word}【是给变量设置默认值,如果该参数不存在,后面的值就是默认值】
${parameter:=word}【如果变量不存在,则word作为返回值并且为该变量赋值word】
${parameter:?word}【是在不存在时报一个相应的message信息】
${parameter:+word}
第一个用法,是给变量设置默认值,如果该参数不存在,后面的值就是默认值,如下示例:
SUSEt:~# u=${1:-root}
SUSEt:~# echo $u
root
$1如果不存在,$u的值是root,如果存在,$u的值是$1。
第二个也是设置默认值 ,具体如下:
SUSEt:~# echo $USER
root
SUSEt:~# echo ${USER:=foo}
root
SUSEt:~# unset USER
SUSEt:~# echo ${USER:=foo}
foo
SUSEt:~# echo $USER
foo
第三个值主要是在不存在时报一个相应的message信息,如下:
SUSEt:~# message=${varName?Error varName is not defined}
-bash: varName:Error varName is not defined
a='123'
rear b
var =${a:-b} 【这里:如果参数b的值未输入,那么var的默认值就取a的变量值】
echo $a