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    

相关