目录
一、前言
二、使用shell回顾shell的一些功能、语句
三、shell语句
四、shell实战
五、结尾
一、前言
学习shell脚本上篇文章是完全不够的,首先还得先从linux最基础的命令开始学起,上一篇文章只能看懂个大概,接下来所有的shell脚本都是从linux命令的基础上来设计的、以及运行的。
因此,学习shell和学习linux命令两者缺一不可!
二、使用shell回顾shell的一些功能、语句
1、通过vim或者vi编写后缀名以.sh结尾的脚本
[root@localhost ] vim 定义脚本.sh
#!/bin/bash
#注意啦,这里必须以这个开头,调用其解释器
echo '=======================$n================================================================='
echo name:$0 #$0代表这个脚本名称,n为数字
echo 1st"参数": $1 #执行时需要赋值
echo # $1-$9代表第一个到第九个参数,十以上的参数需要大括号包含,例如${10}
echo 2st"参数": $2 #执行时需要赋值
echo '=======================$#================================================================='
echo "参与的个数:" $# #显示定义参数的个数
echo '=======================$*================================================================='
echo $* #代表命令行中所有的参数 (并把它们区分开来)
echo '=======================$@================================================================='
echo $@ #代表命令行中所有的参数(并把它们当作一个整体)
echo '=========================================================================================='
echo $((1+2)) #加减乘除运算符需要两个括号才能计算
echo '=========================================================================================='
echo $[1+2] #相当于上面、只是运算需要一个中括号即可
echo '=========================================================================================='
echo $? #最后一次命令的执行状态,0表示正常
echo '=========================================================================================='
#expr 1 + 2 1加2结果等于3,数字与等号间要有空格
#expr 10 - 5 10减5结果等于5,数字与等号间要有空格
#expr 10 \* 2 10乘以2结果等于20,数字与等号间要有空格
#expr 10 / 2 10除以2结果等于5,数字与等号间要有空格,\代表转义,把*转换成乘号
echo '=========================================================================================='
echo ############################################################################################
echo ### 例子
echo ### 1、a="expr 5 \* 2"
echo ### echo $a 结果是expr 5 \* 2
echo ###
echo ### 2、a=$(expr 5 \* 2)
echo ### echo $a 结果是10
echo ###
echo ### 3、a=`expr 5 \* 2`
echo ### echo $a 结果是10
echo ###
echo ### 4、a=$[(2+3)*4]
echo ### echo $a 结果是20
echo #############################################################################################
~
2、赋予脚本执行权限
[root@localhost ] chmod +x 定义脚本.sh
这里解释一下:chmod [选项] [脚本名] 代表赋予所有人都有执行权限
一般在个人实验中,是这样赋予执行权限的,因为除了你自己没人能用到你的,所有这样赋予权限是没问题的;
但在实际工作中,这样是不安全的,出于安全考虑,可以这样赋予权限
[root@localhost ] chmod u+x 定义脚本.sh
代表拥有者有执行权限,其他用户是没有的
这篇是关于shell脚本,大致提一下哈哈,下篇详细解释权限问题
3、看看脚本结果
[root@localhost ] ./定义脚本.sh 100 200 300 400
=======================$n=================================================================
name:./定义脚本.sh
1st参数: 100
2st参数: 200
=======================$#=================================================================
参与的个数: 4
=======================$*=================================================================
100 200 300 400
=======================$@=================================================================
100 200 300 400
==========================================================================================
3
==========================================================================================
3
==========================================================================================
0
==========================================================================================
==========================================================================================
[root@localhost shell脚本.sh]
运行结果出来了,好多空白的地方是什么意思呢,这个具体看脚本内容大致就能了解清楚了
4、下面我们来编辑一个hello脚本
[root@localhost ~] vim hello.sh
[root@localhost ~] chmod +x hello.sh
[root@localhost ~] ./hello.sh
hello,world!
[root@localhost ~] cat hello.sh
#!/bin/bash
echo hello,world!
简单吧,接下来往前扩展一下,给代码加点颜色
#!/bin/bash
echo hello,world!
for i in {
10..50}; do #这里代表从10到50次
echo -e "\e[1;$i;31mhello,world!\e[0m" #从10到50中以红色显示
done
运行效果
还记得上篇文章提到过的吗?
格式:
echo -e "\e[1;42m xxx \e[0m"
这个命令会显示出设定的颜色,即\e[1是标准格式,代表颜色输出开始,\e[0m代表颜色输出结束。
普通颜色:31m定义字体是红色。echo能够识别的颜色如下:30m是黑色,31m是红色,32m是绿色,33m是黄色,34m是蓝色,35m是洋红,36m是青色,37m是白色;
背景色:40m是黑色,41m是红色,42m是绿色,43m是黄色,44m是蓝色,45m是洋红,46m是青色,47m是白色
————————————————
shell的强大不会只有hello,world吧???好了,接下来是介绍shell的重点
三、shell语句
1、if条件判断
单分支if条件语句
单分支的语句最简单,也最容易上手操作和理解,因为它只有一个判断条件,如果符合这个条件则会执行,反之,则不会执行,语法如下:
#!/bin/bash
if [ 条件判断式 ]; #条件判断式是值这一个和另一个的判断,以分号结尾,then执行,fi结尾
then
执行程序(echo ...)
fi
当然也可以这样写
#!/bin/bash
if [ 条件判断式 ]; then
执行程序(echo ...)
fi
例如
[root@localhost ] vim if1.sh
[root@localhost ] chmod +x if1.sh
[root@localhost ] cat if1.sh
#!/bin/bash
aa=$(df -h |grep /dev/sda1 |awk '{print $5}' |cut -d "%" -f1)
#在查看已挂载的所有文件中通过筛选得到的值赋予变量aa
if [ "$aa" -ge 10 ];
#判断变量aa是否大于等于10
then
#如果大于等于10则执行该程序
echo "大于等于!!!"
fi
运行结果
[root@localhost ~] vim if1.sh
[root@localhost ~] chmod +x if1.sh
[root@localhost ~] ./if1.sh
大于等于!!!
[root@localhost ~]
双分支if条件语句
#!/bin/bash
if [ 条件判断式 ]; #条件判断式是值这一个和另一个的判断,以分号结尾,then执行,if是一个判断,elif是另一个判断,fi结尾
then
条件成立时,执行程序
else
条件不成立时,执行的另一个程序
fi
例如
[root@localhost ] vim if2.sh
[root@localhost ] chmod +x if2.sh
[root@localhost ]./if2.sh
httpd is down, must restart
[root@localhost ] cat if2.sh
#/bin/bash
aa=$(netstat -tuln |awk '{print $4}' |grep ":80$")
if [ "$aa" == "" ]
then
echo "httpd is down, must restart"
/etc/rc.d/init.d/httpd start &>/dev/null
else
echo "httpd is ok"
fi
[root@localhost ] 解释:查看apache已开启的端口,用awk截取并输出第4列,再用grep筛选出80端口,如果aa为空,则输出httpd是关闭的,需要重启;否则,输出httpd是开启的
运行结果
[root@localhost ~] ./if2.sh
httpd is down, must restart
[root@localhost ~]
多支条件语句
#!/bin/bash
if [ 条件判断式1 ]; #条件判断式是值这一个和另一个的判断,以分号结尾,then执行,if是一个判断,elif是另一个判断,fi结尾
then
当条件1条件成立时,执行程序1
elif [ 条件判断式2 ];
then
当条件2成立时,执行的程序2
…………省略更多条件…………
else
当所有条件都不成立时,执行该程序
fi
例如
[root@localhost ~] vim ip3.sh
[root@localhost ~] chmod +x ip3.sh
[root@localhost ~] ./ip3.sh
please input a filename: 123
222222222222222222222
[root@localhost ~] ./ip3.sh
please input a filename: abc
222222222222222222222
[root@localhost ~] ./ip3.sh
please input a filename: ..
.. is dire
[root@localhost ~] ./ip3.sh
please input a filename: @
222222222222222222222
[root@localhost ~] cat ip3.sh
#!/bin/bash
read -t 30 -p "please input a filename: " filename
if [ -z $filename ]
then
echo "1111111111111111111"
exit 101
elif [ ! -e $filename ]
then
echo "222222222222222222222"
exit 102
elif [ -f $filename ]
then
echo "$filename is putong"
exit 103
elif [ -d $filename ]
then
echo "$filename is dire"
exit 104
else
echo "$filename is other file"
exit 105
fi
[root@localhost ~] 解释:在控制台上提示用户输入一个文件名,并且只等待30秒,把用户的输入保存在变量filename里。
使用if判断该用户输入的字符串是否为空,如果为空则在屏幕上输出1111111……,退出状态码101;
如果不是,则往下走使用elif判断用户输入的该文件名是否存在,存在为真,则在屏幕上输出2222222……,退出状态码是102;
如果也不是,继续往下走使用elif判断用户输入的该文件名是否存在、并且是否为普通文件,是普通文件为真,则在屏幕上输出用户输出的这个文件名是普通文件(is putong),退出状态码103;
如果还不是,则判断该文件是否存在、并且为目录文件,是目录文件为真,则在屏幕上输出这个这个用户输出的文件名是目录(is dire),退出状态码是104;
……………………这里省略很多判断就不往下写了,可以使用elif一直判断
当所有的条件都不成立时,执行该程序,在屏幕上输出用户输出的这个文件是另一个文件(is other file),退出状态码是105.
最后以fi结尾,这就是个完整的if判断语句。
运行结果
[root@localhost ~] mkdir 123
[root@localhost ~] touch 456
[root@localhost ~] ./ip3.sh
please input a filename: a
222222222222222222222
[root@localhost ~] echo $?
102
[root@localhost ~] ./ip3.sh
please input a filename: ?
222222222222222222222
[root@localhost ~] echo $?
102
[root@localhost ~] ./ip3.sh
please input a filename: 123
123 is dire
[root@localhost ~] echo $?
104
[root@localhost ~] ./ip3.sh
please input a filename: 456
456 is putong
[root@localhost ~] echo $?
103
[root@localhost ~] ./ip3.sh
please input a filename:
1111111111111111111
[root@localhost ~] echo $?
101
[root@localhost ~]
2、case语句
#!/bin/bash
case $变量名 in
"值1")
如果变量的值等于值1,则执行程序1
;;
"值2")
如果变量的值等于值2,则执行程序2
;;
………………省略其他分支………………
*)
如果变量的值都不是以上的值,则执行该程序
;;
esac
例如
#!/bin/bash
read -t 30 -p "please you input yes/no:" a
#在屏幕上输出“请你选择yes/no,然后把用户的输入赋予变量a”
case $a in
#判断变量a的值
yes)
#如果是yes
echo "you input is yes"
exit 100
执行程序1,并退出状态码100
;;
no)
#如果是no
echo "you input is no"
exit 101
执行程序2,并退出状态码101
;;
*)
#如果既不是yes也不是no
echo "you input is not"
exit 102
执行此程序,退出状态码102
;;
esac
[root@localhost ~] 解释:在屏幕上输出“请你选择yes/no,然后把用户的输入赋予变量a
通过case判断
如果用户输入的该变量是yes,则输出你输入的是yes(you input is yes),退出状态码100;
如果用户输入的该变量是no,则输出你输入的是no(you input is no),退出状态码101;
如果既不是yes也不是no,则输出你输入的是不存在的(you input is not),退出状态码102
最后以esac结尾,case开头,结尾再把字母反过来写,并且每个分支程序之后要通过";;"双分号结尾,代表该程序结束。
运行结果
[root@localhost ~] vim case.sh
[root@localhost ~] chmod +x case.sh
[root@localhost ~] ./case.sh
please you input yes/no:yes
you input is yes
[root@localhost ~] echo $?
100
[root@localhost ~] ./case.sh
please you input yes/no:no
you input is no
[root@localhost ~] echo $?
101
[root@localhost ~] ./case.sh
please you input yes/no:1
you input is not
[root@localhost ~] echo $?
102
[root@localhost ~] ./case.sh
please you input yes/no:
you input is not
[root@localhost ~] echo $?
102
3、for循环
#!/bin/bash
for 变量 in 值1 值2 值3……
do
程序
done
又或者
#!/bin/bash
for (( 初始值;循环控制条件;变量变化 ))
do
程序
done
例如
#!/bin/bash
for i in 1 2 3 4
do
echo $i
done
[root@localhost ~] 解释:把1,2,3,4这四个数赋予变量i,最后通过循环i这个变量在屏幕中输出显示
运行结果
[root@localhost ~] vim for1.sh
[root@localhost ~] chmod +x for1.sh
[root@localhost ~] ./for1.sh
1
2
3
4
又例如
#!/bin/bash
s=0
for (( i=1;i<=100;i=i+1 ))
#循环一百次
do
s=$(( $s+$i ))
#每次循环给变量s赋值
done
echo "输出从1加到100的值:" $s
[root@localhost ~] 解释:定义循环100次,每次循环都给变量s赋值,最后输出从1加到100的值
运行结果
#!/bin/bash
s=0
for (( i=1;i<=100;i=i+1 ))
#循环一百次
do
s=$(( $s+$i ))
#每次循环给变量s赋值
done
echo "输出从1加到100的值:" $s
4、while循环
#!/bin/bash
while [ 条件判断式 ]
do
程序
done
例如
#!/bin/bash
i=1
s=0
while [ $i -le 100 ]
do
s=$(( $s+$i ))
i=$(( $i+1 ))
done
echo "The sum is:" $s
[root@localhost ~] 解释:给变量i和s赋值,循环直到变量i的值大于100,就停止循环,最后是输出这个值在屏幕上
运行结果
[root@localhost ~] vim while.sh
[root@localhost ~] chmod +x while.sh
[root@localhost ~] ./while.sh
The sum is: 5050
5、until语句
#!/bin/bash
until [ 条件判断式 ]
do
程序
done
例如
#!/bin/bash
i=1
s=0
until [ $i -gt 100 ]
do
s=$(( $i+$i ))
i=$(( $i+1 ))
done
echo "The sum is:" $s
[root@localhost ~] 解释:给变量i和变量s赋值,循环直到变量i的值大于100,就停止运行,最后输出在屏幕上
运行结果
[root@localhost ~] vim until.sh
[root@localhost ~] chmod +x until.sh
[root@localhost ~] ./until.sh
The sum is: 5050
6、函数
#!/bin/bash
function 函数名 () {
程序
}
例如
#!/bin/bash
function sum () {
s=0
for (( i=0;i<=$1;i=i+1 ))
do
s=$(( $i+$s ))
done
echo "The sum of 1+2+3+……+$1 is:" $s
}
read -t 30 -p "please input a number:" num
y=$(echo $num | sed 's/[0-9]//g')
if [ -z "$y" ]
then
sum $num
else
echo "Error!! please input a number!"
fi
[root@localhost ~] 解释:先定义一个函数sum,再通过循环直到i大于$i位置,$1是函数sum的第一个参数。在函数中也可以使用位置参数变量,不过这里的$1指的是函数的第一个参数ÿ