变量子串
- 格式:${变量}
- 主要的作用:变量子串的效率要比相应的命令执行的效率高
- 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/