Shell脚本编程
1、Shell脚本是什么?
Shell脚本语言为过程式语言,解释运行,依赖于外部程序文件来运行。Shell脚本是命令的堆积,但很多命令不具有幂等性,需要用程序逻辑来判断运行条件是否满足,以避免其运行中发生错误。但并不是所有命令执行失败,都会导致脚本运行终止,命令执行失败,如果产生严重错误,该严重错误指,脚本会exit,任何时候shell脚本或shell解释器遇到exit命令就会终止,或我们使用某种判断机制将其强行终止,或者脚本运行过程中出现语法错误,也可能终止。
编译过程:高级语言–>编译器–>目标代码,如C、C++、Java。
解释过程:高级语言–>解释器–>机器代码,如shell、perl、python。
2、如何编写shell脚本?
脚本文件的第一行顶格,给出shebang,即解释器路径,用于指明解释执行当前脚本的解释器程序文件。常见的解释器如下:
#!/bin/bash #!/usr/bin/python #!/usr/bin/perl
3、运行脚本
(1)赋予执行权限,并直接运行此程序文件。
chmod +x /PATH/TO/SCRIPT_FILE
/PATH/TO/SCRIPT_FILE
(2)直接运行解释器,将脚本以命令行参数传递给解释器程序,脚本不需要执行权限。
bash /PATH/TO/SCRIPT_FILE
4、算术运算
(1)算术运算符:+,-,*,/, **(次方), %(取模)
(2)算术运算格式:
1)let VAR=算术运算表达式
2)VAR=$ [算术运算表达式] (可以直接echo引用,不用变量保存)
3)VAR=$ ((算术运算表达式)) (可以直接echo引用,不用变量保存)
4)VAR=$(expr $ARG1 $OP $ARG2)(可以直接echo引用,不用变量保存)
注意:乘法符号在有些场景中需要使用转义符。
(3)bash中默认都为字符串格式,要进行整型运算时,需要显示声明为整型:
[root@localhost ~]# num1=2 [root@localhost ~]# num2=9 [root@localhost ~]# echo "$num1+$num2" 2+9 [root@localhost ~]# declare -i num3=5 [root@localhost ~]# declare -i num4=11 [root@localhost ~]# echo "$num3+$num4" 5+11 即使声明为整型,仍为字符串输出 [root@localhost ~]# let sum=$num1+$num2 [root@localhost ~]# echo $sum 11 [root@localhost ~]# echo "$[$num3+$num4]" 16 [root@localhost ~]# echo "$(($num2+$num3))" 14 [root@localhost ~]# expr $num2 + $num4 三个参数彼此之间要有空格 20 [root@localhost ~]# expr $num2+$num4 参数之间没有空格 9+11 [root@localhost ~]# sum=$(expr $num2 + $num4) 变量保存 [root@localhost ~]# echo $sum 20
5、条件测试
判断某需求是否满足,需要由测试机制来实现。
如何编写测试表达式以实现所需的测试:
(1)执行命令,并利用命令状态返回值来判断,返回值为0表示成功,返回值为1-255表示失败。
(2)测试表达式
test EXPRESSION 测试命令
[ EXPRESSION ] 测试命令
[[ EXPRESSION ]] 测试关键字
注意:EXPRESSION两端必须有空白字符,否则为语法错误。
(3)bash的测试类型有:数值测试、字符串测试和文件测试。
1)数值测试:数值比较
-eq:是否等于,[ $num1 -eq $num2 ];
-ne:是否不等于;
-gt:是否大于;
-ge:是否大于等于;
-lt:是否小于;
-le:是否小于等于;
2)字符串测试:
==:是否等于;
>:是否大于;
<:是否小于;
!=:是否不等于;
=~:左侧字符串是否能够被右侧的PATTERN所匹配;
-z “STRING”:判断指定的字串是否为空,空则为真,不空则假;
-n “STRING”:判断指定的字符串是否不空,不空则真,空则为假;
注意:此表达式一般用于[[ ]]中,测试表达式中的字符串要加引号;
3)文件测试:
存在性测试:文件的存在性测试,存在则为真,否则则为假。
-a FILE
-e FILE
[root@localhost ~]# [ -e /etc/rc.d/rc.sysinit ] [root@localhost ~]# echo $? 1
6、代码执行顺序
(1)选择执行
单分支的if语句:
if 测试条件 then 代码分支 fi
双分支的if语句:
if 测试条件; then 条件为真时执行的分支 else 条件为假时执行的分支 fi
多分支的if语句:
if CONDITION1; then 条件1为真分支 elif CONDITION2; then 条件2为真分支 elif CONDITION3; then 条件3为真分支 ... elif CONDITIONn; then 条件n为真分支 else 所有条件均不满足时的分支 fi
case语句:
case $VARAIBLE in PAT1) 分支1 ;; PAT2) 分支2 ;; ... *) 分支n ;; esac
(2)循环执行
1)for循环:
for VARAIBLE in LIST; do 循环体 done
2)while循环:
while CONDITION; do 循环体 循环控制变量修正表达式 done
进入条件:CONDITION测试为”真“;
退出条件:CONDITION测试为”假“。
循环示例: 1. 求100以内所有正整数之和。 #!/bin/bash # declare -i sum=0 declare -i i=1 until [ $i -gt 100 ]; do let sum+=$i let i++ done echo $sum #!/bin/bash # declare -i sum=0 declare -i i=1 while [ $i -le 100 ]; do let sum+=$i let i++ done echo $sum