前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >shell学习(九)Shell子串

shell学习(九)Shell子串

原创
作者头像
god_frey
发布2022-05-10 00:12:33
5560
发布2022-05-10 00:12:33
举报

bash一些基础的内置命令

代码语言:javascript
复制
echo
eval
exec
export
read
shift

echo命令

代码语言:javascript
复制
-n    不换行输出
-e    解析字符串中的特殊符号

\n    换行
\r    回车
\t    制表符
\b    退格

ubuntu@VM-12-16-ubuntu:~/shell_program$ echo 你好啊;echo 我很帅
你好啊
我很帅

#不换行打印
ubuntu@VM-12-16-ubuntu:~/shell_program$ echo -n 你好啊;echo 我很帅
你好啊我很帅
ubuntu@VM-12-16-ubuntu:~/shell_program$ echo -n 你好啊;echo -n 我很帅
你好啊我很帅ubuntu@VM-12-16-ubuntu:~/shell_program$ 

#-e解析特殊字符
ubuntu@VM-12-16-ubuntu:~/shell_program$ echo "我看你\n很帅"
我看你\n很帅
ubuntu@VM-12-16-ubuntu:~/shell_program$ echo -e "我看你\n很帅"
我看你
很帅

#打印命令 printf
ubuntu@VM-12-16-ubuntu:~/shell_program$ printf "你好\t我是\t吴彦祖"
你好	我是	吴彦祖ubuntu@VM-12-16-ubuntu:~/shell_program$ printf "你好\t我是\t吴彦祖\n"
你好	我是	吴彦祖

#    printf,echo同是输出命令
#    printf 格式化字符串 ,不默认换行,需要手动添加。%-10s %-4.2f 指定宽度
#    echo 输出字符串 ,默认换行。注意使用转义字符需要开启,否则原样输出

eval

执行多个命令

代码语言:javascript
复制
ubuntu@VM-12-16-ubuntu:~/shell_program$ eval ls;cd /tmp/
different.sh  forks  forks.c  hello.py  hello.sh  special_symbol.sh  special_var.sh
ubuntu@VM-12-16-ubuntu:/tmp$ 

exec

不创建子进程,执行后续命令,且执行完毕后,自动exit

代码语言:javascript
复制
#执行完date命令后,自动exit,即退出当前shell,Connection 
ubuntu@VM-12-16-ubuntu:~/shell_program$ exec date 
Mon May  9 23:01:43 CST 2022

Connection closed.

shell子串的用法

  • 学习基础语法,知道语法后,再应用
代码语言:shell
复制
name="god_frey"

${变量}					    返回变量值
${#变量}					返回变量长度,字符长度
${变量:start}				返回变量start数值之后的字符,且包含start的数字
${变量:start:length}		提前start之后的length限制的字符,例如${name:4:1}
${变量#word}				从变量开头删除最短匹配的word子串 
${变量##word}				从变量开头删除最长匹配的word
${变量%word}				从变量结尾删除最短word
${变量%%word}				从变量结尾开始删除最长匹配的word

# 替换
${变量/pattern/string}	用string代替第一个匹配的pattern
${变量//pattern/string}	用string代替所有的pattern

子串的实际案例

代码语言:javascript
复制
ubuntu@VM-12-16-ubuntu:~$ unset name              #删除变量
ubuntu@VM-12-16-ubuntu:~$ name="god_frey180"      #定义变量
ubuntu@VM-12-16-ubuntu:~$ echo $name
god_frey180
ubuntu@VM-12-16-ubuntu:~$ echo ${name}            #返回变量值
god_frey180
ubuntu@VM-12-16-ubuntu:~$ echo ${#name}           #返回变量长度
11

#截取子串
ubuntu@VM-12-16-ubuntu:~$ echo ${name:3}          #截取第三个字符之后的子串
_frey180
ubuntu@VM-12-16-ubuntu:~$ echo ${name:5}
rey180

#设置起点,以及元素长度
ubuntu@VM-12-16-ubuntu:~$ echo ${name:2:4}        #截取第2个之后的4个字符的子串
d_fr

计算变量长度的方法

代码语言:javascript
复制
ubuntu@VM-12-16-ubuntu:~$ echo $name 
god_frey180
ubuntu@VM-12-16-ubuntu:~$ echo $name | wc -l
1
ubuntu@VM-12-16-ubuntu:~$ echo $name | wc -L
11

# wc命令参数用法
ubuntu@VM-12-16-ubuntu:~/shell_program$ cat test_1.test |wc -l    #统计文件行数
3
ubuntu@VM-12-16-ubuntu:~/shell_program$ cat test_1.test |wc -L    #统计文件最长一行的长度
9
ubuntu@VM-12-16-ubuntu:~/shell_program$ cat test_1.test 
1234
1234567
123456677

# 利用数值计算expr命令
ubuntu@VM-12-16-ubuntu:~/shell_program$ expr length "${name}"
11

# awk统计长度,length函数
ubuntu@VM-12-16-ubuntu:~/shell_program$ echo "${name}" | awk '{print length($0)}'
11

# 最快的统计方式
ubuntu@VM-12-16-ubuntu:~/shell_program$ echo ${#name}
11

字符串长度统计方法速度比较

time命令,统计命令执行时长

for循环

语法:

for 变量 in 序列1~100

for number in {1..100}

do

echo $number

done

代码语言:javascript
复制
ubuntu@VM-12-16-ubuntu:~/shell_program$ for num in {1..3};do echo $num;done
1
2
3

# seq命令,产生序列,默认空格分离
ubuntu@VM-12-16-ubuntu:~/shell_program$ seq 4
1
2
3
4
# seq -s ":" 指定使用冒号分隔
ubuntu@VM-12-16-ubuntu:~/shell_program$ seq -s ":" 4
1:2:3:4

# 产生一个1-10的序列,循环三次,使用:分隔,反引号``引用执行结果,等同$()
ubuntu@VM-12-16-ubuntu:~/shell_program$ for n in {1..3};do str1=`seq -s ":" 10`;echo $str1;done
1:2:3:4:5:6:7:8:9:10
1:2:3:4:5:6:7:8:9:10
1:2:3:4:5:6:7:8:9:10

# 结合time命令  ${#变量} 计算时间
ubuntu@VM$-12-16-ubuntu:~/shell_program$ time for n in {1..10000};do char=`seq -s "god_frey" 100`;echo $ ${#char} &>/dev/null;done 

real	0m9.533s        #实际运行时间
user	0m7.249s        #用户态执行时间
sys	0m2.862s            #内核态执行时间
[2379]+  Done                    echo $ ${#char}

# 使用wc -L命令计算
ubuntu@VM-12-16-ubuntu:~/shell_program$ time for n in {1..10000};do char=`seq -s "god_frey" 100`;echo $ ${char} |wc -L &>/dev/null;done 

real	0m21.848s
user	0m17.954s
sys	0m6.988s

# 使用expr的length命令计算
ubuntu@VM-12-16-ubuntu:~/shell_program$ time for n in {1..10000};do char=`seq -s "god_frey" 100`;expr length "${char}"  &>/dev/null;done 

real	0m17.094s
user	0m12.871s
sys	0m5.040s

# 使用awk的计算
ubuntu@VM-12-16-ubuntu:~/shell_program$ time for n in {1..10000};do char=`seq -s "god_frey" 100`;echo $ ${char} |awk '{print length($0)}' &>/dev/null;done 

real	0m26.996s
user	0m21.144s
sys	0m8.780s

shell编程,尽量使用Linux内置的命令,内置的操作和内置的函数,效率最高C语言开发效率最高,尽可能的减少管道符操作

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档