linux shell 入门学习笔记11 shell子串

shell子串花式用法
#	从头开始删除匹配最短
##	从头开始删除匹配最长
%	从尾开始删除匹配最短的
%%	从尾开始删除匹配最长的

# 指定字符内容截取
a*c	匹配开头为a,中间任意个字符,结尾为c的字符串

${变量}	返回变量值
${#变量}	返回变量长度,字符长度
${变量:start}	返回变量Offset数值之后的字符
${变量:(-start)}	返回变量倒数第n个之后的字符
${变量:start:length}	提取offset之后的length限制的字符
${变量#word}	从变量开头删除最短匹配的word子串
${变量##word}	从变量开头,删除最长匹配的word
${变量%word}	从变量结尾删除最短的word
${变量%%word}	从变量结尾删除最长匹配的word
${变量/pattern/string}	用string代替第一个匹配的pattern
${变量/%pattern/string}	使用%表示除了pattern字符外前面的字符,其中pattern可以使用通配符*
${变量/#pattern/string}	使用#表示以pattern开头的字符,其中pattern可以使用通配符*
${变量//pattern/string}	用string代替所有的pattern
${变量/pattern,,}	将字符串变成小写输出, 也可以使用declare为字符串添加属性,declare -l小写,declare -u大写
${变量/pattern,}	将字符串第一个字符变成小写输出
${变量/pattern^^}	将字符串变成大写输出	
${变量/pattern^}	将字符串第一个字符变成大写输出

shell变量字符串截取一般有两种方式:按照指定位置截取按照名称截取
展示:

xiao123@xiao123:~/Downloads$ name=yuchao180
xiao123@xiao123:~/Downloads$ echo ${name}
yuchao180
xiao123@xiao123:~/Downloads$ echo ${#name}
9
xiao123@xiao123:~/Downloads$ echo ${name:2} #从第3个字符开始输出
chao180
xiao123@xiao123:~/Downloads$ echo ${name:2:4}  #从第3个字符开始输出,输出长度为4
chao
xiao123@xiao123:~/Downloads$ echo ${name#yu}  #删除最短匹配的字符
chao180
xiao123@xiao123:~/Downloads$ echo ${name/yu/1yuyu}  #替换第一个匹配的字符
1yuyuchao180
xiao123@xiao123:~/Downloads$
xiao123@xiao123:~/Downloads/shscripts$ echo ${name:(-3)}
180
xiao123@xiao123:~/Downloads/shscripts$
xiao123@xiao123:~/Downloads/shscripts$ echo ${name/%80/90}
yuchao190
xiao123@xiao123:~/Downloads/shscripts$ echo ${name/#yuchao/yuchao2}
yuchao2180
xiao123@xiao123:~/Downloads/shscripts$ echo ${name/#chao/yuchao2}
yuchao180
xiao123@xiao123:~/Downloads/shscripts$
xiao123@xiao123:~/Downloads/shscripts$ echo ${name/%o*/O}
yuchaO
xiao123@xiao123:~/Downloads/shscripts$ echo ${name/#*chao/yuchao2}
yuchao2180
xiao123@xiao123:~/Downloads/shscripts$
xiao123@xiao123:~/Downloads/shscripts$ echo ${name^}
Yuchao180
xiao123@xiao123:~/Downloads/shscripts$ echo ${name^^}
YUCHAO180
xiao123@xiao123:~/Downloads/shscripts$
实践命令
wc命令

统计文件行数和字符串长度。

-L	统计文件中最长的一行的字符长度,也可以统计字符串长度。
xiao123@xiao123:~/Downloads$ echo ${name} | wc -L
9
xiao123@xiao123:~/Downloads$
-l 统计文件有多行
xiao123@xiao123:~/Downloads$ echo ${name/yu/1yuyu} | wc -l
1
xiao123@xiao123:~/Downloads$
expr命令

length选项:计算字符串长度

xiao123@xiao123:~/Downloads$ expr length ${name}
9
xiao123@xiao123:~/Downloads$
awk命令

内置函数length(arg)也可以统计命令行参数长度。

xiao123@xiao123:~/Downloads$ echo ${name} | awk '{print length($0)}' #其中$0表示一行全部字符
9
xiao123@xiao123:~/Downloads$
time命令

统计命令执行时间长度。

seq命令

生成序列的命令

xiao123@xiao123:~/Downloads$ seq 10
1
2
3
4
5
6
7
8
9
10
xiao123@xiao123:~/Downloads$
xiao123@xiao123:~/Downloads$ seq -s ":" 10
1:2:3:4:5:6:7:8:9:10
xiao123@xiao123:~/Downloads$
实验 字符串统计耗时

方法1

xiao123@xiao123:~/Downloads$ time for i in {0..10000}; do char=`seq -s "------" 100`;echo ${#char} &>/dev/null; done

real    0m6.921s    # 实际运行的时间
user    0m5.377s    # 用户态执行的时间
sys     0m1.784s    # 内核态执行的时间
xiao123@xiao123:~/Downloads$

方法2

xiao123@xiao123:~/Downloads$ time for i in {0..10000}; do char=`seq -s "------" 100`;echo ${char}|wc -L &>/dev/null; don
e

real    0m16.516s
user    0m13.143s
sys     0m4.225s
xiao123@xiao123:~/Downloads$

方法3

xiao123@xiao123:~/Downloads$ time for i in {0..10000}; do char=`seq -s "------" 100`;expr length ${char} &>/dev/null; do
ne

real    0m13.177s
user    0m10.556s
sys     0m3.154s
xiao123@xiao123:~/Downloads$

方法4

xiao123@xiao123:~/Downloads$ time for i in {0..10000}; do char=`seq -s "------" 100`;echo ${char}|awk '{print length($0)
}' &>/dev/null; done

real    0m16.913s
user    0m13.565s
sys     0m4.245s
xiao123@xiao123:~/Downloads$

总结
shell编程,尽量使用Linux内置的命令,内置的操作,和内置的函数,效率最高。因为这个工具都是由C语言开发,效率最高,尽可能减少管道符的操作。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 如果语句是 shell 脚本中的一种判断语句,允许在特定条件为真时执行一组命令,并在特定条件为假时执行另一组命令。语法格式如下: ``` if [ condition ]; then commands1 else commands2 fi ``` 其中 `condition` 是一个测试命令,如果其返回值为真,则执行命令 `commands1`,否则执行命令 `commands2`。 ### 回答2: if语句是shell编程中最基本的控制结构之一,它允许根据条件执行不同的命令或语句块。if语句的基本语法如下: ``` if condition then command1 command2 ... else command3 command4 ... fi ``` 其中,condition是一个测试条件,可以使用比较操作符(例如-eq、-ne、-lt、-gt、-le、-ge)、逻辑操作符(例如&&和||)、以及test命令来测试。如果condition为真,那么if语句中then到else之间的部分会被执行,否则执行else到fi之间的部分(如果有的话)。注意,if、then、else和fi这些关键字都需要用空格分开。 下面是一个简单的例: ``` #!/bin/bash FILE="example.txt" if [ -e "$FILE" ] then echo "$FILE exists." else echo "$FILE does not exist." fi ``` 这个脚本会测试example.txt文件是否存在。如果存在,会输出“example.txt exists.”,否则输出“example.txt does not exist.”。 除了基本语法,if语句还可以使用嵌套的形式来实现更复杂的控制结构。例如: ``` if [ "$VAR1" = "value1" ] then if [ "$VAR2" -lt "10" ] then echo "VAR1 is value1 and VAR2 is less than 10." else echo "VAR1 is value1 but VAR2 is not less than 10." fi else echo "VAR1 is not value1." fi ``` 这个脚本会先测试VAR1变量是否等于value1,如果是,再测试VAR2是否小于10。如果VAR1不是value1,就直接输出“VAR1 is not value1.”。 总之,if语句是shell编程中非常基本的控制结构,可以根据条件执行不同的命令和语句块。学习if语句的基本语法和使用方法,对于编写复杂的shell脚本非常有帮助。 ### 回答3: 在 Linux shell 中,if 语句是一种用于控制流程的条件语句,通常用于判断某个表达式是否成立以执行特定的代码块。if 语句的基本格式为: ``` if [ 条件表达式 ]; then # 条件成立时执行的代码块 else # 条件不成立时执行的代码块 fi ``` 其中,条件表达式一般是一个命令或变量判断的逻辑表达式,如 `if [ $a -eq 1 ]`,表示当变量 `$a` 等于 1 时条件成立;`if [ -f file.txt ]`,表示当当前目录下有名为 file.txt 的文件时条件成立。如果条件成立,则执行 then 后面的代码块,否则执行 else 后面的代码块。 还可以用 elif 关键字设置多个条件分支,格式如下: ``` if [ 条件表达式1 ]; then # 条件1成立执行的代码块 elif [ 条件表达式2 ]; then # 条件2成立执行的代码块 else # 以上条件都不成立则执行的代码块 fi ``` 除了直接在 if 语句行中写条件表达式外,我们还可以采用变量或命令的方式来构造条件表达式,常用的有: - 命令的条件控制: ``` if command; then # command 命令返回 0 时执行的代码块 else # command 命令返回非 0 值时执行的代码块 fi ``` - 变量的条件控制: ``` if [ -n "$var" ]; then # 判断变量是否非空 # 变量不为空时执行的代码块 fi ``` if 语句中还有一些比较特殊的用法,例如: - 判断文件是否存在: ``` if [ -e file ]; then # -e 表示判断文件是否存在 # 文件存在时执行的代码块 fi ``` - 检查字符是否包含另一个字符: ``` if [[ "$str" == *substr* ]]; then # 包含时执行的代码块 fi ``` 总之,if 语句是 Linux shell 编程中最常用的控制流程的条件语句,掌握好 if 语句的写法和用法,可以让你更加灵活地处理各种情况下的程序逻辑问题,提高编程效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值