Loading... <img class=" lazyloaded" title="1481034980961904.jpg" src="https://www.zsythink.net/wp-content/uploads/ueditor/php/upload/image/20161206/1481034980961904.jpg" alt="bash.jpg" data-src="https://www.zsythink.net/wp-content/uploads/ueditor/php/upload/image/20161206/1481034980961904.jpg" style=""> 在shell中,当我们已经获取到某个变量的变量值的时候,可能还需要对变量值进行一定的处理,才能到我们最终想要的结果,今天我们就来聊聊shell中常见的变量处理方法,我们通常会对变量进行如下处理。 一、获取变量的长度(字符串长度)。 二、对变量值进行截取(截取字符串)。 三、替换变量值中的某段字符。 四、删除变量值中的某段字符。 五、对变量值进行大小写转换。 六、当变量值为空时,对变量进行一些操作。 上述处理都是一些常见的操作,我们一个一个慢慢聊,这篇文章中,我们只对前两种操作进行总结,即怎样获取变量长度,以及怎样对变量值进行截取。 <h2 id="wznav_0">一、获取变量长度</h2> 通常,我们有可能需要获取变量值的长度,比如,变量中存放了一个字符串,我们需要获取字符串的长度,则可以使用如下方法。 <img class=" lazyloaded" src="https://www.zsythink.net/wp-content/uploads/2017/08/083017_1437_shell1.png" alt="" data-src="https://www.zsythink.net/wp-content/uploads/2017/08/083017_1437_shell1.png" style=""> 如上图所示,website变量的值为”www.zsythink.net”,”www.zsythink.net”字符串一共由16个字符组成,当输出${#website}时,即可输出变量website的长度,很简单吧。 <h2 id="wznav_1">二、截取变量</h2> 有时候,我们只是需要变量值中的某一段,所以,我们需要截取这段内容为我们所用。而截取变量的方法又有不少,我们一一道来。 <h3 id="wznav_2">从指定位置开始截取字符串</h3> 通常,我们需要从指定的位置开始截取字符串,截取到字符串的末尾,示例如下。 <img class=" lazyloaded" src="https://www.zsythink.net/wp-content/uploads/2017/08/083017_1437_shell2.png" alt="" data-src="https://www.zsythink.net/wp-content/uploads/2017/08/083017_1437_shell2.png" style=""> 上例中的”:4″表示从website变量值的第4个字符开始,截取到变量值的末尾。 细心如你一定发现了,上例中,所谓的从第4个字符开始截取,是”从左向右”数的第4个字符,换句话说,就是从正数第4个字符开始截取,截取到字符串的末尾,如果我们想要从倒数第4个字符开始截取,截取到字符串的末尾,我们该怎么办呢?示例如下 <img class=" lazyloaded" src="https://www.zsythink.net/wp-content/uploads/2017/08/083017_1437_shell3.png" alt="" data-src="https://www.zsythink.net/wp-content/uploads/2017/08/083017_1437_shell3.png" style=""> 上例中的”:0-4″表示从website变量值的倒数第4个字符开始,截取到变量值的末尾。 从上例可以看出,”:0-4″中的”0″可以使用”空格”代替,效果是相同的,但是,从上例中可以看出,”冒号”与”负号”之间如果不存在任何字符,则无法起到截取字符的效果,所以,上图中第三种写法是错误的。 <h3 id="wznav_3">从指定位置开始截取字符串,并且指定截取字符的长度</h3> 除了能够指定截取操作的开始位置,我们还能够指定截取的长度,比如,从变量的第4个字符开始截取,截取8个字符的长度,示例如下。 <img class=" lazyloaded" src="https://www.zsythink.net/wp-content/uploads/2017/08/083017_1437_shell4.png" alt="" data-src="https://www.zsythink.net/wp-content/uploads/2017/08/083017_1437_shell4.png" style=""> 没错,”:4:8″表示从正数第4个字符开始截取,向后截取8个字符的长度。 聪明如你一定想到了,我们能不能从倒数的位置开始,截取指定长度的字符呢?必须能的,示例如下。 <img class=" lazyloaded" src="https://www.zsythink.net/wp-content/uploads/2017/08/083017_1437_shell5.png" alt="" data-src="https://www.zsythink.net/wp-content/uploads/2017/08/083017_1437_shell5.png" style=""> 如上图所示,”:0-12:9″表示从倒数第12个字符开始,向后截取9个字符,与之前的示例同理,”冒号”与”负号”之间如果不存在任何字符,则无法起到截取字符的效果,所以,上图中第三种写法是错误的。 在上述示例中,我们指定了截取字符的长度,比如上例中的”:0-12:9″,表示截取9个字符的长度,其实,在centos7中,我们可以将截取字符的长度指定为”负数”,但是注意,centos6中截取字符串的长度不能为”负数”,否则会报错,我们来看看在centos7中,将截取长度指定为”负数”后的效果。示例如下 <img class=" lazyloaded" src="https://www.zsythink.net/wp-content/uploads/2017/08/083017_1437_shell6.png" alt="" data-src="https://www.zsythink.net/wp-content/uploads/2017/08/083017_1437_shell6.png" style=""> 如上图所示,在centos7中,”:0-12″表示从倒数第12个字符开始,向后截取所有字符,当同时指定截取长度为”:-4″时,表示从倒数第12个字符向后截取所有字符以后,删除截取以后的字符的最后4个字符,换句话说,也可以理解成截取最后12个字符的前8个字符。 但是,使用上述方法是需要注意一点,删除截取以后的字符数量不能大于现有字符的数量,示例如下。 <img class=" lazyloaded" src="https://www.zsythink.net/wp-content/uploads/2017/08/083017_1437_shell7.png" alt="" data-src="https://www.zsythink.net/wp-content/uploads/2017/08/083017_1437_shell7.png" style=""> 如上图所示,我们一共就截取了12个字符,如果将截取长度指定为”-13″,则会报上述错误:-bash: XX : substring expression < 0 注意:在centos7中,使用这种写法的时候要计算好截取的范围,否则会报错 <h3 id="wznav_4">掐头去尾截取之掐头截取</h3> 所谓的”掐头去尾”,其实就是删除某个字符左侧的所有字符(掐头),或者删除某个字符右侧的所有字符(去尾),这样说可能不容易理解,我们来看一些小例子,就能明白了。 先从所谓的”掐头”聊起,示例如下。 <img class=" lazyloaded" src="https://www.zsythink.net/wp-content/uploads/2017/08/083017_1437_shell8.png" alt="" data-src="https://www.zsythink.net/wp-content/uploads/2017/08/083017_1437_shell8.png" style=""> 如上例所示,我们使用”#*.”即可删除字符串中从左向右数第一个 “.” 以及其左侧的全部字符,这就是所谓”掐头去尾”中的掐头,准确的说,应该是掐去头部,截取尾部。 聪明如你一定已经会举一反三了,我们可以把上例中的 “.” 替换成其他字符,也是同样适用的,示例如下。 <img class=" lazyloaded" src="https://www.zsythink.net/wp-content/uploads/2017/08/083017_1437_shell9.png" alt="" data-src="https://www.zsythink.net/wp-content/uploads/2017/08/083017_1437_shell9.png" style=""> 如上图所示,”#*A”表示删除字符串中从左向右第一个遇到的A,以及其左侧的字符。 换句话说,从左向右第一个遇到的A以及其左侧的字符都被当做”头部”掐去了。 其实,除了能够使用”#*字符”的语法进行”掐头”,其实还有另一种方法,也能实现”掐头”的操作,只不过它们略有些不同,示例如下。 <img class=" lazyloaded" src="https://www.zsythink.net/wp-content/uploads/2017/08/083017_1437_shell10.png" alt="" data-src="https://www.zsythink.net/wp-content/uploads/2017/08/083017_1437_shell10.png" style=""> 如上例所示,”##*.”表示删除字符串中从左向右最后一个遇到的 “.” ,以及其左侧的字符。 换句话说,从左向右最后一个遇到的 “.” 以及其左侧的字符都被当做”头部”掐去了。 没错,通过上例即可对比出两种写法的不同。 “#*.”表示删除字符串中从左向右第一个遇到的 “.” ,以及其左侧的字符。 “##*.”表示删除字符串中从左向右最后一个遇到的 “.” ,以及其左侧的字符。 当然,上例中的”.”也是可以根据实际情况替换成其他字符的,示例如下。 <img class=" lazyloaded" src="https://www.zsythink.net/wp-content/uploads/2017/08/083017_1437_shell11.png" alt="" data-src="https://www.zsythink.net/wp-content/uploads/2017/08/083017_1437_shell11.png" style=""> 经过上述示例,你应该已经明白了,赶紧动手试试吧。 <h3 id="wznav_5">掐头去尾截取之去尾截取</h3> 与之前描述的”掐头截取”相似,只要理解了之前的示例,再来理解”去尾截取”,简直不要太简单。 我们先来看一个小示例。 <img class=" lazyloaded" src="https://www.zsythink.net/wp-content/uploads/2017/08/083017_1437_shell12.png" alt="" data-src="https://www.zsythink.net/wp-content/uploads/2017/08/083017_1437_shell12.png" style=""> 如上图所示,”%/*”表示删除字符串中从右向左第一个遇到的 “/” ,以及其右侧的字符。 换句话说,从右向左第一个遇到的 “/” 以及其右侧的字符都被当做”尾部”去掉了。 举一反三,我们可以根据实际情况,将上例中的”/”替换成别的字符,示例如下。 <img class=" lazyloaded" src="https://www.zsythink.net/wp-content/uploads/2017/08/083017_1437_shell13.png" alt="" data-src="https://www.zsythink.net/wp-content/uploads/2017/08/083017_1437_shell13.png" style=""> 聪明如你,一定想到了,”去尾”截取法不止有上述一种方法,还有另一种”去尾”截取法,它们之间也略有不同,示例如下 <img class=" lazyloaded" src="https://www.zsythink.net/wp-content/uploads/2017/08/083017_1437_shell14.png" alt="" data-src="https://www.zsythink.net/wp-content/uploads/2017/08/083017_1437_shell14.png" style=""> 上例中,”%%/*”表示删除字符串中从右向左最后一个遇到的 “/” ,以及其右侧的字符。 换句话说,从右向左最后一个遇到的 “/” 以及其右侧的字符都被当做”尾部”去掉了。 <h2 id="wznav_6">小结</h2> 我们对文章中的语法进行一次总结,方便以后回顾。 <h3 id="wznav_7">获取字符串长度</h3> <div class="enlighter-default enlighter-v-standard enlighter-t-enlighter enlighter-hover enlighter-overflow-scroll"> <div class="enlighter-toolbar"> <div class="enlighter-btn enlighter-btn-raw"></div> <div class="enlighter-btn enlighter-btn-copy"></div> <div class="enlighter-btn enlighter-btn-window"></div> </div> <div class="enlighter"> <div class=""> <div><span class="enlighter-c0"># testvar="12345"</span></div> </div> <div class=""> <div><span class="enlighter-c0"># echo ${#testvar}</span></div> </div> <div class=""> <div><span class="enlighter-n1">5</span></div> </div> </div> </div> <h3 id="wznav_8">从指定位置截取字符串,截取到字符串的末尾</h3> #下例表示从正数第4个字符以后开始截取,直到字符串的末尾。 <div class="enlighter-default enlighter-v-standard enlighter-t-enlighter enlighter-hover enlighter-overflow-scroll"> <div class="enlighter-toolbar"> <div class="enlighter-btn enlighter-btn-raw"></div> <div class="enlighter-btn enlighter-btn-copy"></div> <div class="enlighter-btn enlighter-btn-window"></div> </div> <div class="enlighter"> <div class=""> <div><span class="enlighter-c0"># website="www.zsythink.net"</span></div> </div> <div class=""> <div><span class="enlighter-c0"># echo ${website:4}</span></div> </div> <div class=""> <div><span class="enlighter-text">zsythink.</span><span class="enlighter-m3">net</span></div> </div> </div> </div> #下例表示从倒数第4个字符开始截取,直到字符串的末尾 #注意:下例中的”负号”与”冒号”之间必须存在任意字符(通常使用0或空格占位),否则无法起到截取字符串的作用。 <div class="enlighter-default enlighter-v-standard enlighter-t-enlighter enlighter-hover enlighter-overflow-scroll"> <div class="enlighter-toolbar"> <div class="enlighter-btn enlighter-btn-raw"></div> <div class="enlighter-btn enlighter-btn-copy"></div> <div class="enlighter-btn enlighter-btn-window"></div> </div> <div class="enlighter"> <div class=""> <div><span class="enlighter-c0"># website="www.zsythink.net"</span></div> </div> <div class=""> <div><span class="enlighter-c0"># echo ${website:0-4}</span></div> </div> <div class=""> <div><span class="enlighter-text">.net</span></div> </div> <div class=""> <div><span class="enlighter-c0"># echo ${website: -4}</span></div> </div> <div class=""> <div><span class="enlighter-text">.net</span></div> </div> <div class=""> <div><span class="enlighter-c0"># echo ${website:a-4}</span></div> </div> <div class=""> <div><span class="enlighter-text">.net</span></div> </div> </div> </div> <h3 id="wznav_9">从指定位置截取字符串,并且截取指定的长度</h3> #下例表示从正数第4个字符以后开始截取,截取8个字符。 <div class="enlighter-default enlighter-v-standard enlighter-t-enlighter enlighter-hover enlighter-overflow-scroll"> <div class="enlighter-toolbar"> <div class="enlighter-btn enlighter-btn-raw"></div> <div class="enlighter-btn enlighter-btn-copy"></div> <div class="enlighter-btn enlighter-btn-window"></div> </div> <div class="enlighter"> <div class=""> <div><span class="enlighter-c0"># website="www.zsythink.net"</span></div> </div> <div class=""> <div><span class="enlighter-c0"># echo ${website:4:8}</span></div> </div> <div class=""> <div><span class="enlighter-text">zsythink</span></div> </div> </div> </div> #下例表示从倒数第9个字符开始截取,截取5个字符。 <div class="enlighter-default enlighter-v-standard enlighter-t-enlighter enlighter-hover enlighter-overflow-scroll"> <div class="enlighter-toolbar"> <div class="enlighter-btn enlighter-btn-raw"></div> <div class="enlighter-btn enlighter-btn-copy"></div> <div class="enlighter-btn enlighter-btn-window"></div> </div> <div class="enlighter"> <div class=""> <div><span class="enlighter-c0"># website="www.zsythink.net"</span></div> </div> <div class=""> <div><span class="enlighter-c0"># echo ${website:0-9:5}</span></div> </div> <div class=""> <div><span class="enlighter-text">think</span></div> </div> </div> </div> ##centos7中,截取长度可以为负数,centos6中不行,centos7中的示例如下 #下例表示从正数第4个字符以后开始截取,截取到字符串的末尾,再将截取后的字符串的最后3个字符删除。 <div class="enlighter-default enlighter-v-standard enlighter-t-enlighter enlighter-hover enlighter-overflow-scroll"> <div class="enlighter-toolbar"> <div class="enlighter-btn enlighter-btn-raw"></div> <div class="enlighter-btn enlighter-btn-copy"></div> <div class="enlighter-btn enlighter-btn-window"></div> </div> <div class="enlighter"> <div class=""> <div><span class="enlighter-c0"># website="www.zsythink.net"</span></div> </div> <div class=""> <div><span class="enlighter-c0"># echo ${website:4:-3}</span></div> </div> <div class=""> <div><span class="enlighter-text">zsythink.</span></div> </div> </div> </div> ##centos7中,截取长度可以为负数,centos6中不行,centos7中的示例如下 #下例表示从倒数第4个字符开始截取,截取到字符串的末尾,再将截取后的字符串的最后1个字符删除。 <div class="enlighter-default enlighter-v-standard enlighter-t-enlighter enlighter-hover enlighter-overflow-scroll"> <div class="enlighter-toolbar"> <div class="enlighter-btn enlighter-btn-raw"></div> <div class="enlighter-btn enlighter-btn-copy"></div> <div class="enlighter-btn enlighter-btn-window"></div> </div> <div class="enlighter"> <div class=""> <div><span class="enlighter-c0"># website="www.zsythink.net"</span></div> </div> <div class=""> <div><span class="enlighter-c0"># echo ${website:0-4:-1}</span></div> </div> <div class=""> <div><span class="enlighter-text">.ne</span></div> </div> </div> </div> <h3 id="wznav_10">掐头去尾截取之掐头截取</h3> 掐头截取:删除字符串中从左向右第一个遇到的char,以及其左侧的字符 ##语法:${var#*char} <div class="enlighter-default enlighter-v-standard enlighter-t-enlighter enlighter-hover enlighter-overflow-scroll"> <div class="enlighter-toolbar"> <div class="enlighter-btn enlighter-btn-raw"></div> <div class="enlighter-btn enlighter-btn-copy"></div> <div class="enlighter-btn enlighter-btn-window"></div> </div> <div class="enlighter"> <div class=""> <div><span class="enlighter-c0">#下例表示删除字符串中从左向右第一个遇到的 "." ,以及其左侧的字符。</span></div> </div> <div class=""> <div><span class="enlighter-c0"># website="www.zsythink.net"</span></div> </div> <div class=""> <div><span class="enlighter-c0"># echo ${website#*.}</span></div> </div> <div class=""> <div><span class="enlighter-text">zsythink.</span><span class="enlighter-m3">net</span></div> </div> <div class=""> <div></div> </div> <div class=""> <div><span class="enlighter-c0">#下例表示删除字符串中从左向右第一个遇到的 "//" ,以及其左侧的字符。</span></div> </div> <div class=""> <div><span class="enlighter-c0"># website="https://ww.zsythink.net"</span></div> </div> <div class=""> <div><span class="enlighter-c0"># echo ${website#*//}</span></div> </div> <div class=""> <div><span class="enlighter-text">ww.</span><span class="enlighter-m3">zsythink</span><span class="enlighter-text">.</span><span class="enlighter-m3">net</span></div> </div> </div> </div> 掐头截取:删除字符串中从左向右最后一个遇到的char,以及其左侧的字符 ##语法:${var##*char} <div class="enlighter-default enlighter-v-standard enlighter-t-enlighter enlighter-hover enlighter-overflow-scroll"> <div class="enlighter-toolbar"> <div class="enlighter-btn enlighter-btn-raw"></div> <div class="enlighter-btn enlighter-btn-copy"></div> <div class="enlighter-btn enlighter-btn-window"></div> </div> <div class="enlighter"> <div class=""> <div><span class="enlighter-c0">#下例表示删除字符串中从左向右最后一个遇到的 "/" ,以及其左侧的字符。</span></div> </div> <div class=""> <div><span class="enlighter-c0"># website="https://ww.zsythink.net/index.html"</span></div> </div> <div class=""> <div><span class="enlighter-c0"># echo ${website##*/}</span></div> </div> <div class=""> <div><span class="enlighter-text">index.</span><span class="enlighter-m3">html</span></div> </div> <div class=""> <div></div> </div> <div class=""> <div><span class="enlighter-c0">#下例表示删除字符串中从左向右最后一个遇到的 "." ,以及其左侧的字符。</span></div> </div> <div class=""> <div><span class="enlighter-c0"># website="www.zsythink.net"</span></div> </div> <div class=""> <div><span class="enlighter-c0"># echo ${website##*.}</span></div> </div> <div class=""> <div><span class="enlighter-text">net</span></div> </div> </div> </div> <h3 id="wznav_11">掐头去尾截取之去尾截取</h3> 去尾截取:删除字符串中从右向左第一个遇到的char,以及其右侧的字符 ##语法:${var%char*} <div class="enlighter-default enlighter-v-standard enlighter-t-enlighter enlighter-hover enlighter-overflow-scroll"> <div class="enlighter-toolbar"> <div class="enlighter-btn enlighter-btn-raw"></div> <div class="enlighter-btn enlighter-btn-copy"></div> <div class="enlighter-btn enlighter-btn-window"></div> </div> <div class="enlighter"> <div class=""> <div><span class="enlighter-c0">#下例表示删除字符串中从右向左第一个遇到的 "/" ,以及其右侧的字符。</span></div> </div> <div class=""> <div><span class="enlighter-c0"># testpath="/usr/local/nginx/conf.d"</span></div> </div> <div class=""> <div><span class="enlighter-c0"># echo ${testpath%/*}</span></div> </div> <div class=""> <div><span class="enlighter-text">/usr/local/nginx</span></div> </div> <div class=""> <div></div> </div> <div class=""> <div><span class="enlighter-c0">#下例表示删除字符串中从右向左第一个遇到的 "@" ,以及其右侧的字符。</span></div> </div> <div class=""> <div><span class="enlighter-c0"># testmail="zsy@zsythink.net"</span></div> </div> <div class=""> <div><span class="enlighter-c0"># echo ${testmail%@*}</span></div> </div> <div class=""> <div><span class="enlighter-text">zsy</span></div> </div> </div> </div> 去尾截取:删除字符串中从右向左最后一个遇到的char,以及其右侧的字符 ##语法:${var%%char*} <div class="enlighter-default enlighter-v-standard enlighter-t-enlighter enlighter-hover enlighter-overflow-scroll"> <div class="enlighter-toolbar"> <div class="enlighter-btn enlighter-btn-raw"></div> <div class="enlighter-btn enlighter-btn-copy"></div> <div class="enlighter-btn enlighter-btn-window"></div> </div> <div class="enlighter"> <div class=""> <div><span class="enlighter-c0">#下例表示删除字符串中从右向左最后一个遇到的 "/" ,以及其右侧的字符。</span></div> </div> <div class=""> <div><span class="enlighter-c0"># website="https://ww.zsythink.net/index.html"</span></div> </div> <div class=""> <div><span class="enlighter-c0"># echo ${website%%/*}</span></div> </div> <div class=""> <div><span class="enlighter-text">https:</span></div> </div> <div class=""> <div></div> </div> <div class=""> <div><span class="enlighter-c0">#下例表示删除字符串中从右向左最后一个遇到的 ":" ,以及其右侧的字符。</span></div> </div> <div class=""> <div><span class="enlighter-c0"># testpasswd="root:x:0:0:root:/root:/bin/bash"</span></div> </div> <div class=""> <div><span class="enlighter-c0"># echo ${testpasswd%%:*}</span></div> </div> <div class=""> <div><span class="enlighter-text">root</span></div> </div> </div> </div> 这篇文章就总结到这里,字符串的其他操作,我们会另总结为一篇文章。 希望这篇文章能够帮到你,常来呦~~亲~~~ 转载自朱双印日志https://www.zsythink.net/archives/2276 Last modification:May 29, 2024 © Allow specification reprint Like 如果觉得我的文章对你有用,请随意赞赏