4.7 Shell脚本

一、什么是shell:

shell解释:引用别人的话说:“Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。Shell 既是一种命令语言,又是一种程序设计语言。”

  简而言之,shell是命令解释器之外的一种编程语言。

shell可以做什么:批处理、自动化管理、监控管理、日志数据处理、自动数据备份等等。

二、组成部分和执行方式

1、shell脚本组成部分

​ 1)注释:#开头

​ 2)命令:shell基本语法

​ 3)变量:shell支持字符串变量和整数变量。

​ 4)结构控制语句:流程控制语句

2、执行方式

两种执行方式

​ 1)sh shelltest

​ 2)./shelltest

说明:两种执行方式的权限控制不一样。

三、语法说明

1、注释、指定执行方式、退出

  • 注释等说明信息,要以#开头。
  • 脚本的第一行调用时表明基于bash的方式执行:#!/bin/bash(说明:如果系统默认是bash执行,不写也行)
  • 退出时最好写上:exit 0

示例:

  1. #!/bin/bash
  2. # 我是注释 :-e特殊字符(\a、\n)转义
  3. echo -e "Hello World!\a\n"
  4. exit 0

2、变量和变量的计算

定义变量:name=aa

说明:

  • name:变量名,变量名用小写字母命名
  • \=:赋值符号,两边绝对不能有空格
  • aa:可以为字符串,可以为数值

引用变量:$name(表示引用name的值)

变量的数值计算:

​ 语法:需要使用双层小括号括起来,模运算:% 幂运算:**

示例:实现a + b

  1. #!/bin/bash
  2. a=10
  3. b=20
  4. echo $(($a+$b))
  5. echo $((100+20-20*2))

./shelltest执行,结果为:

  1. 30
  2. 80

字符串操作:

  1. ${#string} : 计算长度
  2. ${string:position} : position开始截取
  3. ${string:position:length} : position开始截取length长度
  4. ${string#substring} : 删除开始的字符串

示例:

  1. ${string#I*.} : 删除从I到.的所有字符(最短匹配)
  2. ${string##I*} : 删除开始I到.所有字符(最长匹配)

3、语句判断

1)判断语句test命令

可以使用:man test查看test的语法说明。

以下为test的几个基本使用:

  1. -f:文件是否存在
  2. -d:目录是否存在
  3. -r:文件是否有读权限
  4. -w:文件是否有写权限
  5. -x:文件是否有执行权限

示例:

  1. #!/bin/bash
  2. filename=/home/zhangsan
  3. test -f $filename && echo 'exist' || 'not exist'

通过./shelltest执行,会显示’not exist’

2)[]判断

注意:

1)中括号中必须用空格隔开

2)中括号中的变量最好以双引号括起来

3)中括号中的常数,最好以单引号括起来

  1. eg:
  2. [ "$a" == "$b" ]&&echo 'yes' || echo 'no'
  3. [ '12' == '10' ]&&echo 'yes' || echo 'no'

4、条件分支

三种条件分支:单分支、双分支、多分支

1)单分支判断

语法:

  1. if[];then
  2. echo 'aa'
  3. fi

示例:

  1. #!/bin/bash
  2. filename=/home/asdf
  3. if[ test -f $filename ];then
  4. echo 'aa'
  5. fi

2)双分支判断

  1. #!/bin/bash
  2. if[];then
  3. echo 'aa'
  4. else
  5. echo 'bb'
  6. fi

3)多分支判断

多分支判断有两种方式:if elif else方式、case in方式。

第一种:if elif else方式

示例:

  1. #!/bin/bash
  2. if[];then
  3. echo 'aa'
  4. elif
  5. echo 'bb'
  6. elif
  7. echo 'cc'
  8. fi

第二种:case in方式

语法:

  1. case $name in
  2. 1);;
  3. echo 'aa'
  4. esac

多分支示例:

从终端接收一个输入参数,然后进行条件判断。(read:接收用户输入)

  1. #!/bin/bash
  2. echo '输入一个值:'
  3. read number
  4. if[ $number == 1 ];then
  5. echo '2'
  6. elif[ $number == 2 ];then
  7. echo '2'
  8. else
  9. echo '错误'
  10. fi

示例,查看硬件信息脚本:

  1. #!/bin/bash
  2. echo '输入一个值:'
  3. read hd
  4. if[ $hd == cpu ];then
  5. cat /proc/cpuinfo
  6. elif[ $hd == mem ];then
  7. cat /proc/meminfo
  8. elif[ $hd == hard ];then
  9. df -h
  10. else
  11. echo '错误'
  12. fi

case in方式的示例:

  1. #!/bin/bash
  2. echo '输入一个值:'
  3. read number
  4. case $number in
  5. 1)
  6. echo '1';;
  7. 2)
  8. echo '2';;
  9. *)
  10. echo '错误';;
  11. esac

5、循环语句

循环语句有三种方式:while do循环、until do循环、for循环

说明:[]中要使用以下转义符号;(())不需要转义。shell推荐使用[]。

[] : -eq -ne -gt -ge -lt -le

(()): == != > >= < <=

1)while do循环

说明:示例中[ $i -eq 5 ] 等价于 (($i==5))。

  1. #!/bin/bash
  2. i=10
  3. while [ $i -eq 5 ];do
  4. echo $i;
  5. ((i--));
  6. done;

2)until do循环:直到..才执行

  1. #!/bin/bash
  2. i=10
  3. until (($a<0));do
  4. echo $i;
  5. ((i--));
  6. done;

3)for循环

  1. #!/bin/bash
  2. for((i=1;i<=10;i++));do
  3. echo $i
  4. done;

6、函数(方法)

参考示例,文件名为shelltest

  1. #!/bin/bash
  2. function print(){
  3. echo '$1'
  4. }
  5. case $1 in
  6. "one")
  7. print 1;;
  8. "two")
  9. print 2;;
  10. *)
  11. print '错误';;
  12. esac

执行的时候可以直接通过控制台直接传参:

  1. $ ./shelltest one

以下执行结果为:2

  1. $ ./shelltest two