本篇内容主要包括以下内容:
- 获取字符串长度的方法
- 各方法间性能比较
- 相关内容补充
说明:本篇内容为学习shell 编程(老男孩教程) 笔记,部分内容为相关视频课程内容,补充部分是我查资料所得,方便理解学习。有需要老男孩shell 编程视频教程的同学,可以在评论区回复。
1.获取字符串长度
首先做个示例数据出来:
zhang@zhang-virtual-machine:~$ vars=`seq -s " " 100`
zhang@zhang-virtual-machine:~$ echo $vars
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100
zhang@zhang-virtual-machine:~$
至于这里涉及到的seq 命令,会在第三部分(相关内容补充中会详细说到)。
1.使用字符串长度获取${#var}
zhang@zhang-virtual-machine:~$ echo ${#vars}
291
zhang@zhang-virtual-machine:~$
2.使用wc 方法
zhang@zhang-virtual-machine:~$ echo $vars | wc -m
292
zhang@zhang-virtual-machine:~$
注:使用这种方法统计出来的字符串长度要比实际字符长度多1。wc 命令会在后面介绍到。
3. 使用$(expr length "$var") 方法
zhang@zhang-virtual-machine:~$ echo $(expr length "$vars")
291
zhang@zhang-virtual-machine:~$
2.性能比较
zhang@zhang-virtual-machine:~$ time for i in $(seq 10000);do count=`echo ${#vars}` ;done;
real 0m11.540s
user 0m0.308s
sys 0m3.764s
zhang@zhang-virtual-machine:~$ time for i in $(seq 10000) ;do count=`echo $vars | wc -m` ;done
real 0m44.385s
user 0m0.480s
sys 0m5.852s
zhang@zhang-virtual-machine:~$ time for i in $(seq 10000);do count=`echo expr length "${chars}"`;done;
real 0m11.681s
user 0m0.204s
sys 0m3.908s
zhang@zhang-virtual-machine:~$
我们看到速度相差几倍(我这里数量级不大,试过好多次,一开始是从一百万开始测试的,结果有点慢,就折中了下),这里数量不大,差异不明显。一般情况调用外部命令处理,与内置功能操作性能相差较大。在shell 编程中,我们应尽量用内置操作或函数完成。
3.相关内容补充
1.seq
这里说下seq 命令的man 结果:
选项比较少:
- -f, --format=格式 使用printf 样式的浮点格式
- -s, --separator=字符串 使用指定字符串分隔数字(默认使用:\n)
- -w, --equal-width 在列前添加0 使得宽度相同
%后面指定数字的位数 默认是%g,%3g那么数字位数不足部分是空格。
zhang@zhang-virtual-machine:~$ seq -f "str%3g" 1 10
str 1
str 2
str 3
str 4
str 5
str 6
str 7
str 8
str 9
str 10
zhang@zhang-virtual-machine:~$ seq -f "str%03g" 1 10
str001
str002
str003
str004
str005
str006
str007
str008
str009
str010
zhang@zhang-virtual-machine:~$ seq -f "str%03g" 90 100
str090
str091
str092
str093
str094
str095
str096
str097
str098
str099
str100
zhang@zhang-virtual-machine:~$
-w选项:指定输出数字同宽
zhang@zhang-virtual-machine:~$ seq -w 1 10
01
02
03
04
05
06
07
08
09
10
zhang@zhang-virtual-machine:~$
-s选项:指定分隔符(默认是回车)
zhang@zhang-virtual-machine:~$ seq -s " | " 1 10
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10
zhang@zhang-virtual-machine:~$ seq -s " | " -f "str%03g" 9 11
str009 | str010 | str011
zhang@zhang-virtual-machine:~$
2.wc
还是一样,先直接上man wc 结果
-c或--bytes或——chars:只显示Bytes数 -l或——lines:只显示列数 -w或——words:只显示字数
zhang@zhang-virtual-machine:~$ cat /etc/passwd | wc
37 59 1968
zhang@zhang-virtual-machine:~$ cat /etc/passwd | wc -c
1968
zhang@zhang-virtual-machine:~$ cat /etc/passwd | wc -m
1968
zhang@zhang-virtual-machine:~$ cat /etc/passwd | wc -w
59
zhang@zhang-virtual-machine:~$ cat /etc/passwd | wc -l
37
zhang@zhang-virtual-machine:~$
3.time
time 命令用来统计给定命令(或程序)运行时间和系统资源消耗情况。
这个命令的详细参数及例子,我推荐这个:http://www.runoob.com/linux/linux-comm-time.html。
expr 这个命令,通过man expr 后可以看到,是执行表达式的。
这个命令由于在 shell 编程中使用的比较多,会在后续新写一篇文章来说一下,简单的可以参考下这个:http://www.runoob.com/linux/linux-comm-expr.html。