目录
Shell脚本编写技巧
Shell脚本中所有的变量都是按照字符串来存储的
1 脚本编写规范
编写shell脚本的最终目的是实现某个特定的功能,为了这个目的需要进行“合理合法”的操作,合理指脚本编写好以后能够实现最终的功能,合法指符合Shell脚本编写的语法知识,使得BASH能够顺利执行脚本中的命令。
1.1 命名规范
对需要命名的地方使用准确而简单的名字,再编写Shell脚本时,需要命名的地方:
-
脚本名称
-
变量名
-
函数名
可以参照匈牙利命名法。匈牙利命名法通过在变量名前面加上相应的小写字母的符号标识作为前缀,标识出变量的作用域,类型等。见名知意。
匈牙利命名法使用方式
(1)变量名称由字母(a-z和A-Z)和数字组成,一般不使用下划线。开头字符可以是任意的字符。字符大小写再Shell脚本中是敏感的。
实际应用中尽量减少使用字符的大小写、字符加数字的方式来区别不同的变量。
(2)命名变量时,如果使用一个单词不能表达变量的用途,可以使用多个单词联合表示,单词之间使用下划线连接,也可以将每个单词的首字母大写。
(3)命名时尽量做到函数名称和实际功能相符合。尽量不要使用fun1()、fun2()这种名称极为接近的形式来进行命令。
1.2 注释风格
Shell脚本中只支持一种注释方式,就是使用‘#’来对井号后面的内容进行注释。在执行Shell脚本时,注释中的内容不会被执行的。
如果要输出井号”#”,使用转义字符反斜杠“\“ 。
当需要注释的范围比较大,工作量也比较大的。可以使用函数的形式间接地注释。如下脚本
# 使用函数注释
#!/bin/bash
fun()
{
echo this #is 'is'
echo 在注释中使用双引号
echo this # is "is"
}
如果在开发过程中,遇到大段的代码需要临时注释起来,过一会儿又取消注释,怎么办呢?每一行加个#符号太费力了,可以把这一段要注释的代码用一对花括号括起来,定义成一个函数,没有地方调用这个函数,这块代码就不会执行,达到了和注释一样的效果。
1.3 其他需要注意地规范
要在适当地地方使用空格和空行。增加脚本地可读性。
-
在输出结果中使用空行,使输出结果一目了然
-
函数中模块与模块之间一般使用一个空行来将不同地模块进行分隔
示例
# 脚本中使用空行
#!/bin/bash
fun1()
{
echo 函数fun1
}
echo 调用函数fun1
fun1
echo 执行其他语句
echo hello world
空格可以在脚本中突出某些特定地内容。但是要注意,在某些场合就不需要空格
-
变量赋值时不要再赋值运算符等号两边使用空格。
进行逻辑判断,测试命令"[]"的前后都需要使用空格
2 脚本优化
2.1 Shell脚本优化原则
编写脚本时,使用内置命令,尽量不要使用外置命令。
内置命令:内置Linux系统源码中的命令,Bash执行这部分命令时,可以不用去磁盘中查找而直接执行,因此执行速度要快于外部命令。
外置命令:使用的时候会先创建新的进程,然后再新的进程中执行命令,这样就会使CPU和内存资源造成浪费。
在Bash中,可以使用type命令查看命令是否为内置命令
在必要的情况下,尽量减少“|”(管道)的使用,因为管道很耗费资源。数据量较多或执行次数较多时,资源消耗会非常明显。
# 使用管道与不用管道比较
#!/bin/bash
fun1()
{
for ((i=0;i<10000;i++))
do
echo hello wordld | tee -a data.txt
done
}
fun2()
{
for ((i=0;i<10000;i++))
do
echo hello wordld >> data.txt
done
}
echo 记录函数fun1执行的时间
time fun1
echo
echo 记录函数fun2执行的时间
time fun2
echo
尽量避免使用管道,使用其他的类似操作来完成,避免使CPU和内存资源造成不必要的浪费。
在进行字符串操作的时候,尽量不要使用awk、sed等高级编辑工具。这些工具需要创建新的进程从而完成字符串的操作。
2.2 提供足够的提示信息
Shell脚本是交互性很强的脚本语言,在脚本的执行过程中需要进行必要的信息提示。
提示信息不是越多越好,而是在关键或重要的地方添加适当的提示性信息即可。
3 脚本使用技巧
3.1 命令选项说明
脚本的编写依赖于Shell命令。
-a 显示全部内容
-c 执行计数功能
-d 指定目录
-e 将内容展开
-f 从指定的文件获取文件
-h 获取帮助信息
-r 以递归的方式处理目录文件
-y 设置所有的问题的选项都是yes
-v 获取命令的版本信息
-i 忽略大小写
对某些特殊的命令,可以使用man命令先查看如何使用。
3.2 算数运算
在Shell脚本中,所有的变量的默认存储方式都是字符串,而其操作方式也是按照字符串进行处理的。
要实现数值的算术运算,使用如下方式:
-
let命令
-
(())命令
-
expr表达式
let命令常用于证数的算术运算,还可以使用长的整数运算,支持除++、--和逗号(,)之外的所有整型运算,使用方式如下:
let 算术表达式
let命令的一般形式中,算术表达式的使用方式和C语言中算术表达式的使用方式类似,可以不必使用$来标识变量,bash会自动进行变量数值的计算。
使用let,表达式必须是完整的,并且算术运算符两边不允许出现空格或其他的字符
(()) 可以理解为代替let命令
((算术表达式))
命令(())和let命令相同,使用时,算术表达式可以只有表达式的右边部分,即表达式的右值。
3.3 高级算数运算
-
bc
bc是Bash中存在的高级运算工具,不但可以实现浮点数的运算,还可以借助其中的函数实现更加复杂的操作。
使用方式如下
"1.20*3.40"|bc
还可以使用特定的函数实现更高级的处理,
"sqrt(10000)"|bc
数值转换
"obase=2;10"|bc