shell脚本

一、 shell脚本

1、 shell脚本,应该拥有以下基本元素

脚本以.sh为扩展名 方便查看

1、第1行的声明“#!/bin/bash”  2、注释:说明某些代码的功能 单行注释: # 多行注释: :<<BLOCK BLOCK (此处英文相照应就行)  3、可执行语句:实现程序的功能 (循环语句、判断、函数、数组、变量) 

2、Shell脚本的执行

方法一:以相对路径的方式去执行shell脚本 方法二:以绝对路径的方式去执行shell脚本 方法三:直接使用bash来执行shell脚本 方法四:在当前的shell环境中执行bash shell脚本:source或.  #区别: 1、方法三:可以在脚本中不指定解释器,脚本可以没有执行权限 2、方法一和方法二脚本需要有执行权限,./script_name.sh 或/path/script_name.sh 3、方法四:当前shell执行,方法1-3开启子shell 

3、 shell脚本编写规范

1)没有必要使用cat命令 使用以下方式即可 grep guru /etc/passwd  2)代码缩进 

4、 位置化参数

这种变量主要是用来向脚本当中传递参数或数据的,变量名不能自定义,变量作用是固定的。  $1 $2 $3 $4 $5 $6 $7 $8 $9 ${10}  预定义变量 是 Bash 中已经定义好的变量,变量名不能自定义,变量作用也是固定的。 $0 :脚本名 $* :所有的参数,双引号引起来时参数视为单个字符串 $@:所有的参数,双引号引起来时,每个参数作为个体 $# :参数的个数 $$ :当前进程的PID $? :上一个命令的返回值0表示成功 

5、read从命令行读入变量值

read从命令行读入变量值  read 变量名 read -p 提示信息:  变量名 read -t 5 -p 提示信息:  变量名 (等待时常5秒)  read命令行中也可以不指定变量 ,如果不指定变量,那么read命令会将接收到的数据放置在环境变 量REPLY中 

6、exit退出码

程序执行后会携带一个退出码: (1) 0代表成功,1-255代表失败 (2) Shell程序的退出码储存在系统变量$?中 (3) exit num可以中断程序并设置退出码为num  举例: ping -c1 baidu.com >> /dev/null echo $? 0 

7、 条件执行运算符

命令是否执行要根据前面命令的退出码 &&代表逻辑与 ||代表逻辑或  举例 [root@wfy ~]#  grep  no_such_user /etc/passwd || echo 'No such user' No such user 

8、复合指令

 复合指令:即一串命令, ()和{}都是对一串的命令进行执行,但有所区别:  相同点: ()和{}都是把一串的命令放在括号里面,如果命令在一行命令之间用; 号隔开  不同点: ()只是对一串命令重新开一个子shell进行执行 {}对一串命令在当前 shell执行  ()最后一个命令可以不用分号 {}最后一个命令要用分号  ()里的第一个命令和左边括号不必有空格 {}的第一个命令和左括号之间必须要有一个空格  举例 [root@wfy ~]# (pwd;cd /tmp;pwd) [root@wfy ~]#  { pwd;cd /tmp;pwd;} # ()子shell中执行,执行完毕,当前路径不变9、文件测试表达式  

9、文件测试表达式

操作符 说明 举例
-b file 检测文件是否是块设备文件,如果是,则返回true。 [ -b $fiIe ]返回fase。
-c file 检测文件是否是字符设备文件,如果是,则返回true [ -c $file ]返回false.
-d file 检测文件是否是目录,如果是,则返回true。 [ -d $file ]返回false.
-f file 检测文件是否是目录,如果是,则返回true检测文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回true。 [ -f $file ]返回true。
-g file 检测文件是否设置了SG1D位,如果是,则返回true. [ -g $file ]返回false。
-k file 检测文件是否设置了粘着位(Sticky Bit),如果是,则返回true。 [ -k $file ]返回false。
-p file 检测文件是否是具名管道,如果是,则返回true. [ -p $file ]返回false。
-u 检测文件是否设置了SUID位,如果是,则返 [ -u $file ]返回false
-r file 检测文件是否可读,如果是,则返回true. [ -r $fiIe ]返回true。

10、 数值运算符

比较两个数值大小

运算符 说明 举例
-eq 检测两个数是否相等,相等返回true。 [ $a-eq $b ]返回true.
-ne 检测两个数是否相等,不相等返回true。 [ $a-ne $b ]返回true。
-gt 检测左边的数是否大于右边的,如果是,则返回true. [ $a-gt $b ]返回false。
-It 检测左边的数是否小于右边的,如果是,则返回true. [ $a-It $b ]返回true。
-ge 检测左边的数是否大等于右边的,如果是,则返回true。 [ $a-ge $b ]返回false.
-le 检测左边的数是否小于等于右边的,如果是,则返回true。 [ $a-le $b ]返回true。

11、 布尔运算符

运算符 说明 举例
! 非运算,表达式为true则返回false,否则返回true。 [ ! false ]返回true
-0 或运算,有一个表达式为true则返回true. [ $a -It 20 -o $b -gt 100 ]返回true。
-a 与运算,两个表达式都为true才返回true. [ $a -it 20 -a $b -gt100 ]返回false。

12、 字符串运算符

运算符 说明 举例
= 检测两个字符串是否相等,相等返回true. [ $a = $b ]返回false。
!= 检测两个字符串是否相等,不相等返回true。 [ $a != $b ]返回true.

13、 条件判断-if语句

#单分支结构 第一种语法: if <条件表达式> then 指令 fi  第二种语法: if <条件表达式>;then 指令 fi  #双分支结构 if <条件表达式>;then 指令序列1 else 指令序列2 fi  #多分支结构 if 条件表达式1;then 命令序列1 elif 条件表达式2;then 命令序列2 else 命令序列n fi  #示例 根据用户输入成绩,判断优良中差。 85-100 优秀--A 70-84 良好--B 60-69 合格--C 60分以下不合格--D read -p Please enter your score (0-100):  grade if [ $grade -ge 85 ]; then echo $grade, A elif [ $grade -ge 70 ]; then echo $grade, B elif [ $grade -ge 60 ]; then echo $grade, C else echo $grade, D fi 

14、 条件判断-case语句

case 变量名 in 值1) 	指令1 	;; 值2) 	指令2 	;; 值3) 	指令3 	;; *) 	指令4 esac   #示例1 由用户从键盘输入一个字符,并判断该字符是否为字母、 数字或者其他字符, 并输出相应的提示信息。 read -p Please enter a character, press enter to continue:  KEY case $KEY in [a-z]|[A-Z]) 	echo Input is letter 	;; [0-9]) 	echo Input is number 	;; *) 	echo Input is other characters esac   #示例2:将判断分数范围用case语句实现 read -p Please enter your score (0-100):  grade case $grade in 8[5-9]|9[0-9]|100) 	echo $grade, A 	;; 7[0-9]|8[0-4]) 	echo $grade, B 	;; 6[0-9]) 	echo $grade, C 	;; *) 	echo $grade, D esac  

15、 循环语句-for循环

#方法1:直接列出元素方法 for i in 1 2 3 4 5 do echo $i done  #方法2:使用大括号 for i in {1..5} do echo $i done  #方法3:使用seq for i in $(seq 1 5) do echo $i done  #方法4:使用命令的结果 for i in $(ls *.sh) do echo $i done