shell字符串截断、切片与默认值

字符串切片

语法如下:
${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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容