1.条件判断
if单条件判断
if [ 条件判断式 ]
then
语句块
fi
案例1:统计根分区使用率
[root@localhost ~]$ vi sh/if1.sh
#!/bin/bash#把根分区使用率作为变量值赋予变量rate
rate=$(df -h | grep "/dev/sda1" | awk '{print $5}’| cut -d "%"-f1)#判断rate的值如果大于等于80,则执行then程序
if [ $rate -ge 80 ]
then
echo "Warning!!!" #打印警告信息。
fi
案例解释:上面这个案例是用来统计/dev/sda1这个区域使用率的。
首先df -h能打印出如下信息
cps@ubuntu:~/test$ df -h
Filesystem Size Used Avail Use% Mounted on
udev 3.9G 0 3.9G 0% /dev
tmpfs 796M 9.3M 787M 2% /run
/dev/sda1 39G 5.0G 32G 14% /
tmpfs 3.9G 188K 3.9G 1% /dev/shm
grep "/dev/sda1"可以在df -h打印出的信息中检索出含有 "/dev/sda1" 的那行内容A。
然后awk '{print $5}’可以利用awk工具将A行以空格为分割符来进行分割。这样就得到了6个数据:/dev/sda1、39G、5.0G、32G、14%、/,并且{print $5}可以打印出第5列的内容,即14%这个内容。
通过管道符继续下一层过滤,cut -d "%"-f1。cut工具选项-d就是以xx作为分割符,这里分割符是%这个字符,分割下来后,再通过-f1来选择分割出的第一个数据:14。这样就实现了去除%的一个作用
案例2:创建目录
[root@localhost ~]$ vi sh/add_dir.sh
#!/bin/bash
#创建目录,判断是否存在,存在就结束,反之创建
echo "当前脚本名称为$0"
DIR="/media/cdrom"
if [ ! -e $DIR ]
then
mkdir -p $DIR
fi
echo "$DIR 创建成功"
上面这个案例是判断目录是否存在,若不存在就创建一个目录。其中if [ ! -e $DIR ]的-e就是判断是否存在的文件判断符。
mkdir -p中的-p可以创建一个完全不存在的路径,并且把路径包含的目录(不存在的目录)都创建出来。
if双条件判断
if [ 条件判断式 ]
then
语句块1
else
语句块2
fi
和C一样,不写案例了。
if多条件判断
if [ 条件判断式1 ]
then
当条件判断式1成立时,执行程序1
elif [ 条件判断式2 ]
then
当条件判断式2成立时,执行程序2
elif [ 条件判断式3 ]
then
当条件判断式3成立时,执行程序3 …
…
…
...
else
当所有条件都不成立时,最后执行此程序
fi
和python差不多
案例1:判断用户输入的是什么文件
[root@localhost ~]$ vi sh/if-elif.sh
#!/bin/bash
#判断用户输入的是什么文件read -p "Please input a filename: " file
#接收键盘的输入,并赋予变量file
if [ -z "$file” ]
#判断file变量是否为空
then
echo "Error, please input a filename"
#如果为空,执行程序1,也就是输出报错信息
exit 1
#退出程序,并返回值为Ⅰ(把返回值赋予变量$P)
elif [ ! -e "$file” ]
#判断file的值是否存在
then
echo "Your input is not a file!"
#如1果不存在,则执行程序2
exit 2
#退出程序,把并定义返回值为2
elif [ -f "$file” ]
#判断file的值是否为普通文件
then
echo "$file is a regulare file!”
#如果是普通文件,则执行程序3
elif [ -d "$file” ]
#到断file的值是否为目录文件
then
echo "$file is a directory!"
#如果是目录文件,网执行程序4
else
echo "$file is an other file!”
#如果以上判断都不是,则执行程序5
fi
2.多分支选择判断:case
case $变量名 in
"值1")
如果变量的值等于值1,则执行程序1
;;
"值2")
如果变量的值等于值2,则执行程序2
;;
*)
如果变量的值都不是以上的值,则执行此程序
;;
esac
案例1:判断输入的字符
#!/bin/bash
read -p "请输入一个字符,并按下enter:" KEY
case "$KEY" in
[a-z] | [A-Z])
echo "输入的是字母!"
;;[0-9])
echo "输入的是数字!"
;;*)
echo "输入内容不是数字也不是字母!"
;;
esac
案例解释,这是一个用户输入字符,脚本判断字符种类的一个应用。这里的判断条件出现了[0-9]、[a-z]这类的范围判断,这个[ ]内代表着一个范围,其中任何一个在这个范围内的字符都满足[0-9],而且这里有个注意事项,即[ ]的内部不能出现空格,必须连续的0-9,包括0-9前后也不能出现空格。
3.for循环
语法1:
for 变量名 in 值1 值2 值3 值4....(也可以放一个文件)
do
语句块
done
这种语法中for循环的次数,取决于in后面值的个数(空格分隔),有几个值就循环几次,并且每次循环都把值赋予变量。 也就是说,假设in后面有三个值,for会循环三次,第一次循环会把值1赋予变量,第二次循环会把值2赋予变量,以此类推。
语法2:
for ((语句1;语句2;语句3))
do
语句块
done
这个语法跟C中的for用法一样。语句1一般是赋值,例如i=1。语句2是判断,结束循环的条件。语句3是i的一个变化,例如i++啊i=i+2啊。然后执行顺序就是:语句1-语句2-语句块-语句3-语句2 - 语句块-语句3-语句2 - 语句块-语句3-语句2.....
案例1:批量打印时间
案例2:批量压缩打包文件到各自指定文件夹内
循环的语句块中干了几件事:
1、dir变量赋值为.../test文件夹内的ls命令中的每个xxx.sh文件通过cut命令把 ‘.’ 当成分割符来切分并取值第一位切割下的字符串,例如ls后第一个是cal.sh,则dir就为cal。
2、创建一个名为变量dir的目录
3、压缩文件
4、移动文件到创建的目录
5、6、计算这是第几个文件并打印出来地址
4.while循环
while [条件判断]
do
语句块
done
案例1:从1到10的阶乘
计算1-10的阶乘采用了while的循环,结束条件是[ $i -le 10 ],就是i小于等于10。
这里要注意条件判断[ ]内每个字符之间都要用空格隔开
案例2:猜价格数字游戏
值得注意的是 let TIMES++可以直接自加变量的值。而不需要写TIMES=&(expr $TIMES + 1),以及可以使用exit 0来退出循环(类似break)
5.until循环
和while相同的语法,只不过until循环的条件判断是不成立就执行,while是成立才执行。刚好反过来。
例如while true是执行循环,而until false是执行循环。
6.函数
function 函数名(){
程序
}
案例1:用户输入一个数字,利用函数计算出从1加到该数的结果
这个案例中有个sed处理命令,这里用到了正则表达式和替换的功能。核心原理是利用sed将输入的字符串中的数字项去除,看看剩余的字符是否为空,如果是空,代表输入的都是数字,则可以判断输入的是数字而不是其他内容。
s/代表替换,g代表全局搜索。‘s/搜索内容/替换内容/g’就是全局下搜索内容并替换。
7.特殊流程控制
exit流程
exit可以退出shell,并且如果后面加了数字的话可以返回那个数字,例如上面这个案例中,如果输入的字符是数字,就会返回1,输入的是其他字符就会返回0
这个返回值可以执行完shell脚本后通过命令行输入$?来查看。这样就可以shell之间传递信息了。例如两个shell:A.sh和B.sh,A.sh里执行B.sh,并且可以通过B.sh的执行返回值来决定要干什么事情,比如B.sh中是否正确完整的执行了,如果执行成功就返回1,A.sh只有收到B.sh的1才会往下执行,不然就会终止。这样便可以做到多任务多模块间协调运行了。
break语句和continue语句
这两个跟C语言一样,其中break是退出整个循环,continue是退出这一次循环,本质上还在循环内。