标签:target style title blank border
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标签:target style title blank border
原文地址:http://1983939925.blog.51cto.com/8400375/1534953