Shell脚本笔记(3)- 变量子串

Shell脚本笔记(3)- 变量子串变量子串 格式 变量 主要的作用 变量子串的效率要比相应的命令执行的效率高 man bash 参考 parameter 内容 parameter 变量 含义 para 返回变量的内容 para 返回变量 para 的长度 按照范围 cut 截取 para offset 在 para 中 从位置 offset 之后开始截取字符串 删除

大家好,我是讯享网,很高兴认识大家。

变量子串

  • 格式:${变量}
  • 主要的作用:变量子串的效率要比相应的命令执行的效率高
  • man bash 参考 parameter
内容 parameter 变量 含义
${para} 返回变量的内容
${#para} 返回变量para的长度
按照范围cut截取
${para:offset} 在para中。从位置offset之后开始截取字符串
删除
${para#word} 从para开头删除最短匹配word的子串
${paraword} 从para开头,删除最长匹配word的子串
${para%word} 从para结尾,删除最短匹配word的子串
${para%%word} 从para结尾,删除最长匹配word的子串
替换
${para/pattern/string} 使用string替换第一个匹配pattern的子串
${para//pattern/string 使用syringe替换所有匹配pattern的子串

${para}

返回变量的内容

wxl@ubuntu:~/workspace/shellScripts$ semd=111.111 wxl@ubuntu:~/workspace/shellScripts$ echo ${semd} 111.111 

讯享网

${#para}

返回变量内容的长度

讯享网wxl@ubuntu:~/workspace/shellScripts$ echo ${#semd} 7 wxl@ubuntu:~/workspace/shellScripts$ echo ${semd}|awk '{print length()}' 7 wxl@ubuntu:~/workspace/shellScripts$ echo ${semd}|wc -L 7 # 测试命令的效率 wxl@ubuntu:~/workspace/shellScripts$ time for n in {1..10000}; do echo ${n}|wc -L >/dev/null ;done real 0m9.732s user 0m7.202s sys 0m3.259s wxl@ubuntu:~/workspace/shellScripts$ time for n in {1..}; do echo ${#n} >/dev/null ;done real 0m0.343s user 0m0.309s sys 0m0.031s 

面试题:I am semdaaa linux, welcome to our country. 显示字符串大于6的单词

#/bin/bash #tips: # 去除语句中的,. echo sentence|tr '想要替换的字符' '用什么字符代替替换的字符' # -gt --> greater than 表示大于 -ge --> greater equal 表示大于等于 # 需要将命令的执行结果放到变量中的话,需要将命令用``框起来 text=`echo I am semdaaa linux, welcome to our country.|tr ',.' ' '` echo ${text} for word in ${text} do if [ ${#word} -gt 6 ];then echo "${word} is greater than 6 ---" fi done # awk方法 wxl@ubuntu:~/workspace/shellScripts/Day3-parameter$ echo I am semdaaa linux, welcome to our country|awk -F'[ ,.]' '{for(i=1;i < NF;i++) if(length($i)>6) print $i}' | | | # awk方法 wxl@ubuntu:~/workspace/shellScripts/Day3-parameter$ echo I am semdaaa linux, welcome to our country|awk -F'[ ,.]' '{ for(i=1;i < NF;i++) if(length($i)>6) print $i }' #方法2 RS=后面的参数表示遇到就结束这一行,所以可以将这些字符串分割 wxl@ubuntu:~/workspace/shellScripts/Day3-parameter$ echo I am semdaaa linux, welcome to our country|awk -vRS="[ ,.]" 'length()>6' semdaaa welcome country 

${para:offset}

在para中,提取offset之后的字符串

讯享网wxl@ubuntu:~/workspace/shellScripts/Day3-parameter$ semd=111..111 wxl@ubuntu:~/workspace/shellScripts/Day3-parameter$ echo ${semd:1} 11..111 wxl@ubuntu:~/workspace/shellScripts/Day3-parameter$ echo ${semd:4} .111 # 表示取第4个字符开始的3个字符串 wxl@ubuntu:~/workspace/shellScripts/Day3-parameter$ echo ${semd:4:3} .11 wxl@ubuntu:~/workspace/shellScripts/Day3-parameter$ echo ${semd:4:2} .1 # 同样的cut命令也可以达到这样的效果 wxl@ubuntu:~/workspace/shellScripts/Day3-parameter$ echo $semd |cut -c 1-3 111 # 两者的效率对比 wxl@ubuntu:~/workspace/shellScripts/Day3-parameter$ time for n in {1..10000}; do echo ${semd:1:3} >/dev/null ;done real 0m0.038s user 0m0.028s sys 0m0.010s wxl@ubuntu:~/workspace/shellScripts/Day3-parameter$ wxl@ubuntu:~/workspace/shellScripts/Day3-parameter$ wxl@ubuntu:~/workspace/shellScripts/Day3-parameter$ wxl@ubuntu:~/workspace/shellScripts/Day3-parameter$ time for n in {1..10000}; do echo $semd |cut -c 1-3 >/dev/null ;done real 0m6.871s user 0m5.489s sys 0m2.132s wxl@ubuntu:~/workspace/shellScripts/Day3-parameter$ 

${para#word}

删除字符串

# 删除字符串:${字符串#i} 从左边开始删除,只删除第一个匹配的字符 # ${字符串*i} 从左边开始删除,删除所有匹配i之前的内容 wxl@ubuntu:~/workspace/shellScripts/Day3-parameter$ text='i am a nio engineer' wxl@ubuntu:~/workspace/shellScripts/Day3-parameter$ echo ${text#i} am a nio engineer wxl@ubuntu:~/workspace/shellScripts/Day3-parameter$ echo ${text#* } am a nio engineer wxl@ubuntu:~/workspace/shellScripts/Day3-parameter$ echo ${text* } engineer # ${变量%内容} 删除从右边开始的内容 wxl@ubuntu:~/workspace/shellScripts/Day3-parameter$ text1='i am a good man' 传输n开始的字符串 wxl@ubuntu:~/workspace/shellScripts/Day3-parameter$ echo ${text1%n} i am a good ma # 删除从所有匹配的m开始往后的所有的字符串 wxl@ubuntu:~/workspace/shellScripts/Day3-parameter$ echo ${text1%%m*} i a # 用于取出路径的文件名和目录 wxl@ubuntu:~/workspace/shellScripts/Day3-parameter$ name=/etc/systemd/system.conf # 取出文件名 wxl@ubuntu:~/workspace/shellScripts/Day3-parameter$ echo ${name*/} system.conf # 取出文件路径 wxl@ubuntu:~/workspace/shellScripts/Day3-parameter$ echo ${name%/*} /etc/systemd 

${para/pattern/string}

替换子串

讯享网wxl@ubuntu:~/workspace/shellScripts/Day3-parameter$ text='i am an engineer' wxl@ubuntu:~/workspace/shellScripts/Day3-parameter$ echo ${text/a/b} # 只替换了第一个匹配的子串 i bm an engineer wxl@ubuntu:~/workspace/shellScripts/Day3-parameter$ echo ${text//a/b} # 替换所有匹配的子串 i bm bn engineer 

变量扩展

${para:-word}

当para没有赋值或者值为空的时候,para就等于默认值word

wxl@ubuntu:~$ wxl@ubuntu:~$ echo ${para:-/tmp} /tmp wxl@ubuntu:~$ para=/back wxl@ubuntu:~$ echo ${para} /back 

${para:=word}

当para没有赋值或者值为空的时候,para就等于默认值word,并且修改变量的值


讯享网

讯享网# para还是为空 wxl@ubuntu:~$ echo ${para:-/tmp/} /tmp/ wxl@ubuntu:~$ echo ${para} wxl@ubuntu:~$ # para的值变为/tmp wxl@ubuntu:~$ unset para wxl@ubuntu:~$ echo ${para:=/tmp} /tmp wxl@ubuntu:~$ echo ${para} /tmp 

${para:?word}

表示如果para是空或者没有,就会把word作为错误输出;有值的话就会按照赋值输出

wxl@ubuntu:~$ echo ${para:?/tmp} -bash: para: /tmp wxl@ubuntu:~$ $? 1: command not found 

${para:+word}

如果para是空或者没有赋值的话就什么都不做,如果赋值的话就会把赋的值覆盖为word

讯享网wxl@ubuntu:~$ para=/mnt wxl@ubuntu:~$ wxl@ubuntu:~$ wxl@ubuntu:~$ echo ${para:+/tmp} /tmp 

补充:变量的赋值

直接复制 a=1
引用命令赋值:test=text=ping baidu.com
read赋值:
-p: 输入提示信息,参数放在最后
-s:不显示输入信息
-t:设置超时时间,超过时间就会结束命令

wxl@ubuntu:~$ read -p "ip:" addr ip:10.0.0.1 wxl@ubuntu:~$ echo ${addr} 10.0.0.1 #隐藏输入内容 wxl@ubuntu:~$ read -p -s "ip:" addr ip: wxl@ubuntu:~$ echo ${addr} 10.0.0.1 #设置超时 wxl@ubuntu:~$ read -t 5 -s -p "ip:" addr ip:10.0.0.1 wxl@ubuntu:~$ echo ${addr} 10.0.0.1 

小结

目前学习了一些变量
表示位置的变量:$0 $n $# $* $@

表示状态:$? $$ $_ $!

变量子串:${arg} ${#arg}

删除:${arg#word} ${arg%word}

替换:${arg/ / } ${arg// / }

讯享网# 参考目前linux的脚本中使用到的一些语句 wxl@ubuntu:~$ ll /etc/init.d/ 
小讯
上一篇 2025-02-20 10:18
下一篇 2025-02-14 11:27

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/32871.html