脚本简单地说就是一条条的文字命令,这些文字命令是可以看到的(如可以用记事本打开查看、编辑),脚本程序在执行时,是由系统的一个解释器,将其一条条的翻译成机器可识别的指令,并按程序顺序执行。因为脚本在执行时多了一道翻译的过程,所以它比二进制程序执行效率要稍低一些。
脚本可以自动化完成某个工作,所以说写好脚本可以使运维工程师的工作更加轻松。
shell script是利用shell的功能所写的一个“程序”(program),这个程序是使用纯文本文件,将一些shell的语法或命令写在里面,搭配正则表达式、管道命令与数据流重定向等功能,以达到我们所想要的处理目的。
学习shell script的好处:
1、自动化管理(比如说把每天都需要手动执行的任务写成一个脚本,让其在指定的时间内运行)
2、追踪与管理系统 (比如说启动Linux 服务)
3、简单的***检测功能 (比如说可以写一个脚本,让其自动检测系统有没有异常,如果有异常,就通知管理员或立即加强防火墙规则)
4、连续命令单一化 (是指整合一些在命令行执行的连续命令,将它们写在脚本中,而后直接执行脚本就OK了)
5、简易的数据处理 (比如说比较两个数据的比较、字符串是否相等)
6、跨平台
7、可以帮助我们弄清楚Linux的来龙去脉
下面就开始脚本编程的基础知识学习吧 !
一、善于使用判断式:
test命令和判断符号[]都可以用于测试字符串、文件状态和数字,也可以同控制流结合。
语法格式:
test 条件判断式
[ 条件判断式 ] 注意:中括号和条件判断式之间必须要有空格
1、字符串测试:
=(或==)
两个字符串是否相等
!=
两个字符串是否不相等
-z
判断字符串是否为空,若为空则为真
-n
判断字符串是否为不空,若为不空则为真
2、文件类型判断:
-e
该文件名是否存在
-f
该文件名是否存在并且为文件
-d
该文件名是否存在并且为目录
-L
该文件名是否存在并且为链接文件
-b
该文件名是否存在并且为块设备
-c
该文件名是否存在并且为字符设备
-p
该文件名是否存在并且为管道文件
-s
该文件名是否存在并且为套接字文件
3、文件权限检测:
-r
该文件名是否存在并且具有可读权限
-w
该文件名是否存在并且具有可写权限
-x
该文件名是否存在并且具有可执行权限
-u
该文件名是否存在并且具有SUID属性
-g
该文件名是否存在并且具有SGID属性
-k
该文件名是否存在并且具有Sticky属性
-s
该文件名是否存在并且为非空白文件
4、数值测试:
-eq
两个数值相等(equal)
-ne
两个数值不等(not equal)
-gt
数值1大于数值2(greater than)
-lt
数值1小于数值2(less than)
-ge
数值1大于等于数值2(greater than or equal)
-le
数值1小于等于数值2(less than or equal)
5、多重条件判断:
-a,&&
逻辑与
-o,||
逻辑或
!
非
二、条件判断式用法详解:
1、if条件判断
if条件判断是指当符合某个条件时就执行。
单分支if语句:
单分支的if语句是最简单的选择结构,这种结构只判断指定的条件,当“条件成立”时执行相应的操作。否则不做任何操作,语句格式如下:
if [条件判断式];then
statement
fi
例子:
写一个脚本,使用if语句计算2个数的大小,如果数字2大于数字1,就显示数字2>数字1 。
脚本内容如下:
- #!/bin/bash
- #Name:compare
- #Description:compare the size of two numbers
- #Author:Linli
- #Version:0.0.1
- #Datatime:06/16/12 14:15:00
- #Usage: ./compare.sh NUM1 NUM2
- ##### scripts ########
- if [ $1 -le $2 ];then
- echo "$2 > $1"
- fi
- ##### scripts ########
脚本执行结果如下:
- [root@www.magedu.com scripts]# ./compare.sh 2 3
- 3 > 2
双分支if语句:
双分支的if语句使用了两路命令操作。在条件成立或不成立的时候分别执行不同的命令序列,,格式如下:
if [条件判断式];then
statement
else
statement
fi
例子:
补充上面的脚本,如果数字2不大于数字1,就显示数字2<=数字1。
将上面脚本中的scripts中的内容修改为如下内容:
- ##### scripts ########
- if [ $1 -le $2 ];then
- echo "$2 > $1"
- else
- echo "$2 <= $1"
- fi
- ##### scripts ########
脚本执行结果如下:
- [root@www.magedu.com scripts]# ./compare.sh 3 1
- 1 <= 3
多分支if语句:
多分支if语句,可以进行多次判断,格式如下
if [条件判断式];then
statement 1
elif [条件判断式];then
statement 2
elif [条件判断式];then
...
else
statement n
fi
例子:
补充上面的脚本,如果数字2小于数字1,就显示数字2<数字1,否则就显示数字2=数字1。
将上面脚本中的scripts中的内容修改为如下内容:
- ##### scripts ########
- if [ $1 -lt $2 ];then
- echo "$2 > $1"
- elif [$1 -gt $2 ]
- echo "$2 < $1"
- else
- echo "$2 = $1"
- fi
- ##### scripts ########
脚本执行结果如下:
- [root@www.magedu.com scripts]# ./compare.sh 3 1
- 1 < 3
- [root@www.magedu.com scripts]# ./compare.sh 3 3
- 33 = 3
2、case...esac
常用于一个变量可能有多个变量值,每一个变量值执行不同的代码段。
使用格式:
case $变量名称 in
变量值1)
statement
;;
变量值2)
statement
;;
...
*)
statement
;;
esac
例子:
写一个脚本,使用case语句完成以下功能:
1、提示用户输入一个用户名;
2、显示一个菜单给用户,形如:
U|u show UID
G|g show GID
S|s show SHELL
Q|q quit 。
3、提醒用户选择一个选项,并显示其所选择的内容;
脚本内容如下:
- #!/bin/bash
- #Name:menu
- #Description:case
- #Author:Linli
- #Version:0.0.1
- #Datatime:06/17/12 15:00:00
- #Usage: ./menu.sh
- ##### scripts ########
- read -p "Please key in an user name: " name
- cat << EOF
- U|u) show UID
- G|g) show GID
- S|s) show SHELL
- Q|q) quit
- EOF
- read -p "Please key in your choice: " choice
- case $choice in
- U|u)
- id -u $name
- ;;
- G|g)
- id -g $name
- ;;
- S|s)
- grep "^$name" /etc/passwd | cut -d: -f7
- ;;
- Q|q)
- echo "quit"
- exit 0
- ;;
- esac
- ##### scripts ########
脚本执行结果如下:
- [root@www.magedu.com scripts]# ./menu.sh
- Please key in an user name: bin
- U|u) show UID
- G|g) show GID
- S|s) show SHELL
- Q|q) quit
- Please key in your choice: u
- 1
3、脚本function
shell script中的函数就是自定义一段执行代码,也可以说成是一些功能模块,有利于结构化编程和代码重用。
脚本function的使用格式:
function 函数名 {
statement
}
函数名() {
statement
}
例子:
写一个脚本:
使用函数实现:
1、判断一个用户是否存在,用户名通过参数传递而来;
如果存在,就显示此用户的shell和UID
如果不存在,就说此用户不存在;
2、提示用户输入用户名,而后将其传递给上面的函数;
3、判断结束后不退出,而是提示用户可继续输入其它用户名,或输入(quit)退出;
脚本内容如下:
- #!/bin/bash
- #Name:user
- #Description:function
- #Author:Linli
- #Version:0.0.1
- #Datatime:06/17/12 15:40:00
- #Usage: ./user.sh
- ##### scripts ########
- myuser() {
- if `grep "$1" /etc/passwd &> /dev/null` ;then
- echo "shell: `grep "^$1" /etc/passwd | cut -d: -f7` UID:`id -u $1`"
- else
- echo "This user is not exist..."
- fi
- }
- read -p "Please key in an user name: " name
- until [ "$name" == "quit" ];do
- myuser $name
- read -p "You can continue key in an user name: " name
- done
- echo "quit"
- ##### scripts ########
脚本执行结果如下:
- [root@www.magedu.com scripts]# ./user.sh
- Please key in an user name: root
- shell: /bin/bash UID:0
- You can continue key in an user name: bin
- shell: /sbin/nologin UID:1
- You can continue key in an user name: gentoo
- shell: /bin/bash UID:502
- You can continue key in an user name: quit
- quit
- [root@www.magedu.com scripts]#
注意:
函数的返回值是函数调用时所执行的函数体中的最后一条语句的状态返回值;可以使用return命令自定义函数返回值。
三、循环
循环分为不定循环和固定循环(即循环几次是事先定义好的)
1、不定循环
不定循环是指符合指定的条件就循环执行某段代码段。
不定循环有:while..do..done 、 until..do..done
使用格式为:
while [ 条件判断式 ];do
statement
done
until [ 条件判断式 ];do
statement
done
注意:while是指符合条件判断时才开始循环,直到条件不满足时退出。
until是指不符合条件判断时才开始循环,直到条件满足时退出。
例子1:
写一个脚本:计算100以内整数的和
脚本内容如下:
- #!/bin/bash
- #Name:sum
- #Description:while
- #Author:Linli
- #Version:0.0.1
- #Datatime:06/17/12 16:10:00
- #Usage: ./sum.sh
- ##### scripts ########
- declare -i sum=0
- declare -i I=1
- while [ $I -le 100 ];do
- sum+=$I
- let I++
- done
- echo "1+2+3+..+100=$sum"
- ##### scripts ########
脚本执行结果如下:
- [root@www.magedu.com scripts]# ./sum.sh
- 1+2+3+..+100=5050
例子2:
写一个脚本,显示此分区使用率的相关信息:
1、提醒用户输入一个分区,而后显示其使用率信息;
2、直到用户输入q或Q退出;
脚本内容如下:
- #!/bin/bash
- #Name:disk
- #Description:until
- #Author:Linli
- #Version:0.0.1
- #Datatime:06/17/12 16:55:00
- #Usage: ./disk.sh
- ##### scripts ########
- read -p "Please key in a disk partition: " disk
- until [ "$disk" == "q" -o "$disk" == "Q" ];do
- fdisk -l $disk
- done
- echo "quit"
- ##### scripts ########
脚本执行结果如下:
- [root@www.magedu.com scripts]# ./disk.sh
- Please key in a disk partition: /dev/sda
- Disk /dev/sda: 343.5 GB, 343597383680 bytes
- 255 heads, 63 sectors/track, 41773 cylinders
- Units = cylinders of 16065 * 512 = 8225280 bytes
- Device Boot Start End Blocks Id System
- /dev/sda1 * 1 13 104391 83 Linux
- /dev/sda2 14 5235 41945715 8e Linux LVM
- /dev/sda3 5236 5366 1052257+ 82 Linux swap / Solaris
- /dev/sda4 5367 41773 292439227+ 5 Extended
- /dev/sda5 5367 5975 4891761 fd Linux raid autodetect
- /dev/sda6 5976 6584 4891761 fd Linux raid autodetect
- /dev/sda7 6585 7193 4891761 fd Linux raid autodetect
- /dev/sda8 7194 7802 4891761 fd Linux raid autodetect
- /dev/sda9 7803 9019 9775521 8e Linux LVM
- /dev/sda10 9020 10236 9775521 8e Linux LVM
- /dev/sda11 10237 10480 1959898+ 83 Linux
- Please key in a disk partition: q
- quit
补充while的相关知识点:
while true;do
statement
done
while [1];do 这个和while true一样
statement
done
while read LINE;do
statement
done < 文件路径
下面来举例说明以上3种while循环的使用方法:
例子1:
写一个脚本,使用while true;do..done 完成以下功能:
1、提示用户输入一个用户名;
2、显示一个菜单给用户,形如:
U|u show UID
G|g show GID
S|s show SHELL
Q|q quit 。
3、提醒用户选择一个选项,并显示其所选择的内容;显示完成后不退出,继续提示用户输入选项。
脚本内容如下:
- #!/bin/bash
- #Name:menu
- #Description:case
- #Author:Linli
- #Version:0.0.1
- #Datatime:06/17/12 17:30:00
- #Usage: ./menu.sh
- ##### scripts ########
- read -p "Please key in an user name: " name
- cat << EOF
- U|u) show UID
- G|g) show GID
- S|s) show SHELL
- Q|q) quit
- EOF
- while true;do
- read -p "Please key in your choice: " choice
- case $choice in
- U|u)
- id -u $name
- ;;
- G|g)
- id -g $name
- ;;
- S|s)
- grep "^$name" /etc/passwd | cut -d: -f7
- ;;
- Q|q)
- echo "quit"
- exit 0
- ;;
- ?)
- echo "Wrong choice"
- continue
- ;;
- esac
- done
- ##### scripts ########
脚本执行结果如下:
- [root@www.magedu.com scripts]# ./menu.sh
- bash menu2.sh
- Please key in an user name: root
- U|u) show UID
- G|g) show GID
- S|s) show SHELL
- Q|q) quit
- Please key in your choice: u
- 0
- Please key in your choice: t
- Wrong choice
- Please key in your choice: s
- /bin/bash
- Please key in your choice: g
- 0
- Please key in your choice: q
- quit
例子2:
写一个脚本,使用while read LINE;do..done 完成以下功能:
显示/etc/passwd中的每一行内容。
脚本内容如下:
- #!/bin/bash
- #Name:read
- #Description:while read LINE
- #Author:Linli
- #Version:0.0.1
- #Datatime:06/17/12 17:30:00
- #Usage: ./read.sh
- ##### scripts ########
- while read LINE;do
- echo "$LINE"
- echo "OK"
- done < /etc/passwd
- ##### scripts ########
脚本执行结果如下:
- [root@www.magedu.com scripts]# ./line.sh
- root:x:0:0:root:/root:/bin/bash
- OK
- bin:x:1:1:bin:/bin:/sbin/nologin
- OK
- daemon:x:2:2:daemon:/sbin:/sbin/nologin
- OK
- adm:x:3:4:adm:/var/adm:/sbin/nologin
- OK
- ... [显示的其它内容省略了]
2、固定循环
固定循环是指事先规定好循环几次。
使用格式为:
for 变量 in LIST;do
statement
done
例子:
写一个脚本,显示每一位用户的默认shell;
eg.
root: /bin/bash
student: /bin/bash
脚本内容如下:
- #!/bin/bash
- #Name:shell
- #Description:for
- #Author:Linli
- #Version:0.0.1
- #Datatime:06/17/12 17:20:00
- #Usage: ./shell.sh
- ##### scripts ########
- for I in `cut -d: -f1 /etc/passwd`;do
- echo "$I : `grep "^$I" /etc/passwd | cut -d: -f7`"
- done
- ##### scripts ########
脚本执行结果如下:
- [root@www.magedu.com scripts]# ./oddsum.sh
- root : /bin/bash
- bin : /sbin/nologin
- ...[其他显示内容省略了]
四、break、continue、exit、return的用法
break : 中断循环,而后执行循环后面的语句
continue: 中断当前这一次循环,提前进入下一次循环
exit:
直接退出脚本
return: 用作自定义返回值
转载于:https://blog.51cto.com/smile2013/910508