Bash编程语法结构
一、for结构
其中 $var 是循环控制变量,[list] 是 $var 需要遍历的一个集合,
do/done 对包含了循环体,相当于 C 语言中的一对大括号。另外如果
do 和 for 被写在同一行,必须在 do 前面加上 ";"。如:
for $var in [list]; do 。下面是一个运用 for 进行循环的例子:
二、while适用于循环次数未知,或不便用for直接生成较大的列表时;
while 测试条件; do
循环体
done
测试条件为真,进入循环;测试条件为假,退出循环;
测试条件一般通过变量来描述,需要在循环体不变量地改变变量的值,
以确保某一时刻测试条件为假,进而结束循环;
三、until格式:
until 测试条件; do
循环体
Done
测试条件为假,进入循环;测试条件为真,退出循环;
测试条件一般通过变量来描述,需要在循环体不变量地改变变量的值,
以确保某一时刻测试条件为真,进而结束循环;
四、If 结构
单分支结构 双分支结构 及多分支结构
练习:给定一个文件路径
1、判断此文件是否存在;不存在,则说明文件不存,并直接结束脚本;
2、如果文件是否普通文件,则显示为“regular file”;
如果文件是目录,则显示为“directory”;
如果文件是链接文件,则显示为“Symbolic file";
否则,则显示为“unknown type.”
五、case 条件选择
case string in exp-1) 若干个命令行1 ;; exp-2) 若干个命令行2 ;; …… *)
其他命令行
esac
shell通过计算字符串string的值,将其结果依次和表达式exp-1、
exp-2等进行比较,直到找到一个匹配的表达式为止,如果找到了
匹配项则执行它下面的命令直到遇到一对分号(;;)为止。
在case表达式中也可以使用shell的通配符(“*”、“?”、
“[ ]”)。通常用“*”作为case命令的最后表达式以便使在前面
找不到任何相应的匹配项时执行“其他命令行”的命令。
示例:服务脚本示例
#!/bin/bash # chkconfig: 2345 67 34 srvName=$(basename $0) lockFile=/var/lock/subsys/$srvName start() { if [ -f $lockFile ];then echo "$srvName is already running." return 1 else touch $lockFile [ $? -eq 0 ] && echo "Starting $srvName OK." return 0 fi } stop() { if [ -f $lockFile ];then rm -f $lockFile &> /dev/null [ $? -eq 0 ] && echo "Stop $srvName OK" && return 0 else echo "$srvName is not started." return 1 fi } status() { if [ -f $lockFile ]; then echo "$srvName is running." else echo "$srvName is stopped." fi return 0 } usage() { echo "Usage: $srvName {start|stop|restart|status}" return 0 } case $1 in start) start ;; stop) stop ;; restart) stop start ;; status) status ;; *) usage exit 1 ;;
esac
六、循环条件控制 contine 、 break
continue: 提前进入下一轮循环
用于条件语句中,仅在某些个特殊场景提前进入;
break [n]:跳出当前循环
用于条件语句中,跳出当前循环
七、函数
function F_NAME { 函数体 } F_NAME() { 函数体 } 可调用:使用函数名 函数名出现的地方,会被自动替换为函数; 脚本: 函数的返回值: 函数的执行结果返回值:代码的输出 函数中的打印语句:echo, print 函数中调用的系统命令执行后返回的结果 执行状态返回值: 函数体中最后一次执行的命令状态结果 自定函数执行状态的返回值:return #
脚本:写一个脚本,能够ping探测指定网络内的所有主机是否在线?
#!/bin/bash # quitScript() { echo "Quit..." } trap 'quitScript; exit 5' SIGINT cnetPing() { for i in {1..254}; do if ping -c 1 -W 1 $1.$i &> /dev/null; then echo "$1.$i is up." else echo "$1.$i is down." fi done } bnetPing() { for j in {0..255}; do cnetPing $1.$j done } anetPing() { for m in {0..255}; do bnetPing $1.$m done } netType=`echo $1 | cut -d"." -f1` if [ $netType -ge 1 -a $netType -le 126 ]; then anetPing $netType elif [ $netType -ge 128 -a $netType -le 191 ]; then bnetPing $(echo $1 | cut -d'.' -f1,2) elif [ $netType -ge 192 -a $netType -le 223 ]; then cnetPing $(echo $1 | cut -d'.' -f1-3) else echo "Wrong" exit 2 fi
转载于:https://blog.51cto.com/1983939925/1534953