前言
※1.1 为什么要学习shell编程
Shell脚本语言是实现Linux/UNIX系统管理及自动化运维所必备的重要工具,Linux/UNIX系统的底层及基础应用软件的核心大都涉及Shell脚本的内容。每一个合格的Linux系统管理员或运维工程师,都需要能够熟练地编写Shell脚本语言,并能够约定系统及各类软件附带的Shell脚本内容。只有这样才能提升运维人员的工作效率,适应日益复杂的工作环境,减少不必要的重复工作,从而为个人的职场发展奠定较好的基础。
1.2 学好Shell编程所需的基础知识
学好Shell编程并通过Shell脚本轻松地实现自动化管理企业生产系统的必备基础如下:
(1)能够熟练使用vim编辑器,熟练SSH终端及”.vimrc”等的配置
(2)要有一定的Linux命令基础,至少需要掌握80个以上Linux常用命令,并能够熟练使用他们。
(3)要熟练掌握Linux正则表达式及三剑客命令(grep、sed、wak)
(4)熟悉常见的Linux网络服务部署、优化、日志分析及排除。
分支与循环
分支结构
※1.1单分支结构
对于if来说,简单来说,其语义类似于汉语里的“如果…..那么”
第一种语法
if < 条件表达式 >
then
指令fi
第二种语法
if < 条件表达式 > ;then
指令
fi
条件表达式为真,执行指令,为假,不执行指令。
注:上文的“条件表达式”部分可以是test、[]、[[]]、(())、甚至可以把命令直接作为条件表达式,命令执行成功,条件表达式就true,就可以执行指令。
★例1
if [ -d /etc/ ]
then
echo “/etc/ is a directory”
fi
输出结果为:/etc/ is a directory
[ -d /etc/ ] 是判断/etc/是否为目录,显然,根下的/etc/是目录,所以为真,执行echo “/etc/ is a directory “。
★例2
if hostname > /dev/null ;then
echo “it is successful”
fi
输出结果为:it is successful
在hostname &> /dev/null中hostname执行成功没问题,然后把执行结果重定向/dev/null,/dev/null相当于一个黑洞,写入里面的内容永远消失。我们只关心hostname这条命令是否执行成功,而不去管它的结果,因为结果都写入了黑洞,显然,hostname命令执行成功,条件判断为真,执行指令echo “it is successful”
※ 1.2双分支结构
if条件语句的单分支结构主体就是“如果…..,那么……..”,而if条件语句的双分支结构主体则为“如果…….那么…….”.
if 条件语句的双分支结构语法为:
if <条件表达式>;then
指令集1
else
指令集2
fi
★例3
num=10
if [[ $num -eq 10 ]];then
echo “10”else
echo “not 10”
fi
说明:给变量num赋值10 , [[ $num -eq 10 ]] 判断变量的值是否等于10 , 等于10 , 执行echo “10” , 不等于10 , 执行 echo ” not 10 ” .
※ 1.3多分支结构
if 条件语句多分支结构的主体为 “如果…… , 那么…….. , 否则如果……..,那么 , 那么 , 否则如果….. , 那么…… , 否则……” .
if条件语句多分支结构语法:
if <条件表达式1>;then
指令1
elif <条件表达式2>;then指令2
elif <条件表达式3>;then
指令3else
指令4
fi
是不是有晕呢 ? 下面举个很贴近生活的例子 , 比如你就相当一个女孩儿
如果 <你有房>
那么
我就嫁给你或者如果 <你爸有背景>
那么
我也可以嫁给你
或者如果 <你很努力吃苦>
那么
我们 可以先谈谈男女朋友
否则
不理你
果如
★例子4
if [[ -f $file ]];then
echo “$file is ordinary file “
elif [[ -d $file ]]
echo “$file is directory file “
elif [[ -L $file ]]
echo “$file is link file “
else
echo “$file is other file “
fi
说明:第一个判断是 , 如果变量file是普通文件就执行echo “$file is ordinary file ” , 如果变量file是目录文件就执行echo “$file is directory file ” , 如果变量是链接文件就执行echo “\$file is link file ” , 否则就执行echo “\$file is other file ” .
※ for循环
for 循环语句和while循环语句类似 , 但是for循环语句主要是用于执行次数有限的循环 , 而不是用于守护进程及无线循环 . for循环语句常见的语法有两种 , 下面我们将一 一介绍 .
###
● 第一种 for 循环语句的结构如下:
for 变量名 in 变量取值列表 ; do
指令
done
for 后面有个”变量名” , 变量名依次获取in关键字后面的变量取值列表内容 , 每次仅取一个 , 然后仅取一个 , 然后进入循环 do 和 done 之间的部分 , 执行循环内的所有指令 , 当执行单done时结束本次循环 . 之后 , “变量名” 再继续获取变量列表里的下一个变量值 , 继续执行循环内的所有指令 , 当执行到done时结束返回 . 以此类推 , 直到取完变量列表里的最后一个值并进入循环执行到done结束为止 .
★例5
计算从1加100的整数
#/bin/bash
sum=0
for i in {1..100}; do
let sum+=i
done
echo sum=$sum
脚本输出结果:5050
说明:变量 i 依次从1到100里面取数 , 取一次就进去循环 , sun 变量的值就加一次变量 i 取的值 , 加完之后结束一次循环 , 紧接着i 取下一个值 , 直到取到变量列表里面的最后一个值100 , 加完循环结束 . 跳出for 循环 , 执行 echo sum= $sum , 输出就为5050 . 同学们可以用数学算法验证下 , 这种计算方法出来的是否正确 , 如果数学计算这里不再赘述 .
● 第二种for循环语句称为C语言型语句 , 其语法结构如下:
for 关键字后的双口号内是三个表达式 , 第一个是变量初始化(例如:i=1) , 第二个为变量的范围(例如: i<100 ) , 第三个为变量自增自减(例如: i++) . 当第一个表达式的初始化值符合第二个变量的范围时 , 就进入循环执行 ; 当条件不满足就退出循环 .
for (( expr1; exp2; exp3 ))
do
指令
done
★例6
for (( i=1 ; i<10 ; i++ ))
do
echo $i
done
输出:1 2 3 4 5 6 7 8 9
说明: 变量i 初始化的值为1 , 变量的范围时1到10 , 并且小于10 , 自增 , 输出1到9的整数 .
※while循环和until循环
循环语句命令常用于重复执行一条指令或一组指令 , 直到条件不再满足时停止 , Shell脚本语言的循环语句常见的有 while util for 及 select 循环语句 .
while 循环语句主要用来重复执行一组命令或语句 , 在企业实际应用中 , 常用于守护进程或持续运行的程序 , 除此以外 , 大多数循环都会用到上文讲解的for循环语句 .
while 循环语句的基本语法:
while <条件表达式>
do
指令…..
done
上文多次解释条件表达式和指令 , 这里和上文的用法类似 , 下面举例来理解while 循环语句 .
★例7
同样我们用while实现求1加到100的和
sum=0
while [[ i -le 100 ]];do
let sum+=i
let i++
done
echo sum=$sum
说明:条件表达式里面规定 , 当i 小于等于100 时 , 执行let sum+=i 和 let i ++ ;当i 大于100 时 , 退出将不再执行指令 , 退出循环 . let sum+=i 表示 , sum = sum + i 每循环一次 , 执行一次 , let i++ 表示 每次i自增加1 . 循环结束 , 执行echo sum=$sum 命令 , 标准输出 变量sum的值 .
※ case条件语句
case条件语句相当于多分支的if/elif/else条件语句 , 但是它比这些条件语句看起来
更规范更工整 , 常被应用与实现系统服务启动脚本等企业应用场景中 .
在case 语句中 ,程序会将case获取的变量的值与表达式部分的值1 值2 值3 等逐个
进行比较 , 如果获取的变量值和某个值相匹配 , 就会执行值后面对应的指令 , 直到执
行到双分号 ;; 才停止 , 然后再跳出case语句主体 , 执行case语句后面的其他命令 .
case 条件语句的语法:
case “变量” in
值1)
指令……
2)
指令…
*)
指令…..
esac
★例8
#!/bin/bash
read -p “Please choose yes or no :” choose
case $choose in
[Yy]|[Yy][Ee][Ss])
echo “your choose is yes “
[Nn]|[Nn][Oo])
echo “your choose is no “
*)
echo “please input yes or no “
case
说明:read -p “Please choose yes or no :” choose 提示用户输入一个值 , 并赋值变量shoose .
※ reak continue exit 的区别和对比
break continue 在条件语句及循环语句( for while if ) 中用于控制程序的走向 ; 而exit 则用于终止所有语句并退出当前 , 除此之外 , exit 还可以返回上一次程序或命令的执行状态值给当前shell ; return类似于exit , 只不过return 仅用于在函数内部返回函数执行的状态值 . 关于这几个命令的基本说明如下表:
条件与循环控制及程序返回值命令知识
命令 | 说明 |
---|---|
break n | 如果省略n,则跳出整个循环,n表示跳出循环的层数 |
continue n | 如果省略n,则表示跳过本次循环,忽略本次循环的剩余代码,进入循环的下一次循环.n表示退到第n层继续循环 |
exit n | 退出当前shell城西,n为上一次程序执行的状态返回值.n也可以省略,在下一个shell里可通过”$?”接受exit的n值 |
return n | 用于在函数里作为函数的返回值,以判断函数执行是否正确.在下一个shell里可通过”$?”接受exit的n的值 |