一、 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