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

变量子串

  • 格式:${变量}
  • 主要的作用:变量子串的效率要比相应的命令执行的效率高
  • man bash 参考 parameter
内容 parameter 变量含义
${para}返回变量的内容
${#para}返回变量para的长度
按照范围cut截取
${para:offset}在para中。从位置offset之后开始截取字符串
删除
${para#word}从para开头删除最短匹配word的子串
${para##word}从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..100000}; 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/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值