上篇文章讲到字符串的截取可以用字符位置索引的方式,即
从字符串第二个位置开始截取5个(索引值从0开始)
echo "${string:1:5}"
我们还可以使用#+*+字符或%+字符+*的方式进行从左或从右的截取。
废话不多说,直接上例子。
#!/bin/bash
str="https://mp.csdn.net/mp_blog/creationhttps://mp.csdn.net/mp_blog/creation"
echo "str : ${str}"
echo "str#*/ : ${str#*/}"
echo "str##*/ : ${str##*/}"
echo "str%/* : ${str%/*}"
echo "str%%/* : ${str%%/*}"
输出
str : https://mp.csdn.net/mp_blog/creationhttps://mp.csdn.net/mp_blog/creation
str#*/ : /mp.csdn.net/mp_blog/creationhttps://mp.csdn.net/mp_blog/creation
str##*/ : creation
str%/* : https://mp.csdn.net/mp_blog/creationhttps://mp.csdn.net/mp_blog
str%%/* : https:
#*/?就是从字符串左边开始删除到第一个/号结束,输出结果就是保留未删除右边字符。
##*/ 就是从字符串左边开始删除到最后一个/号结束,输出结果就是保留未删除右边字符。
%/* 就是从字符串右边开始删除到右起第一个/号结束,输出结果就是保留未删除左边字符。
%%/* 就是从字符串右边开始删除到右起最后一个/号结束,输出结果就是保留未删除左边字符。
#代表从左删除,%代表从右删除,这很好理解,最易混淆在其中作怪的就是*的位置。
下面是*位置错误的例子,结果是无变化
#!/bin/bash
str="https://mp.csdn.net/mp_blog/creationhttps://mp.csdn.net/mp_blog/creation"
#*位置用法错误,输出不生效
echo "str#/* : ${str#/*}"
echo "str##/* : ${str##/*}"
echo "str%*/ : ${str%*/}"
echo "str%%*/ : ${str%%*/}"
输出结果
str#/* : https://mp.csdn.net/mp_blog/creationhttps://mp.csdn.net/mp_blog/creation
str##/* : https://mp.csdn.net/mp_blog/creationhttps://mp.csdn.net/mp_blog/creation
str%*/ : https://mp.csdn.net/mp_blog/creationhttps://mp.csdn.net/mp_blog/creation
str%%*/ : https://mp.csdn.net/mp_blog/creationhttps://mp.csdn.net/mp_blog/creation
我们可以看到#号出现时,*在截取位置字符的右边,不生效;%号出现时,*在截取位置字符的左边,不生效。
我们可以这样理解:*是截取时删除的内容,从左删除时,删除内容是符号的左边,所以*在字符左边,不可能说从左边第一个字符开始删除,删除的是右边的内容;
同理,从右删除时,删除的内容是从右第一个字符开始,不可能删除的是左边的内容。