条件判断式, 有以下形式:
例如以下例子:
利用case...esac判断,语法如下:
function函数语法:
循环,while do done, until do done,不定循环,以下语法规则:
for...do...done(固定循环),语法:
shell的追踪与调试,有以下命令:
只有一个判断式:
if [ 条件判断式 ]; then
...
fi
一个条件判断:
if [ 条件判断式 ]; then
...
else
...
fi
多个条件判断:
if [ 条件判断式 ]; then
...
elif [条件判断式 ]; then
...
else
...
fi
例如以下例子:
#/bin/bash
#判断$1是否为hello,是则显示信息,如果没有参数,则提示用户输入参数
#如果输入的参数不是hello,就提示用户仅能使用hello做参数
if [ "$1" == "hello" ]; then
echo "Hello, how are you?";
elif [ "$1" == "" ]; then #注意空字符串的表示
echo "please input some param";
else
echo "param can be 'hello'!";
fi
netstat -tuln: 取得目前主机启动的服务,检测主机开启的服务:
#/bin/bash
#通过netstat命令判断哪些服务开放
testing=$(netstat -tuln | grep ":80 ")
echo $testing
if [ "$testing" != "" ]; then
echo "WWW is runing in your system"
fi
testing=$(netstat -tuln | grep ":22")
if [ "$testing" != "" ]; then
echo "SSH is running in your system"
fi
testing=$(netstat -tuln | grep ":21")
if [ "$testing" != "" ]; then
echo "FTP is running in your system"
fi
testing=$(netstat -tuln | grep ":25")
if [ "$testing" != "" ]; then
echo "Mail is running in your system"
fi
再如,输入退伍日期,计算从现在到退伍日期的时间:
#/bin/bash
#计算距退伍还有多长时间
read -p "Please input your demobilization date(YYYYMMDD ex>20140824): " date2
#利用正则表达式测试一下输入是否正确
date_d=$(echo $date2 | grep '[0-9]\{8\}')
if [ $date_d == "" ]; then
echo "You input the wrong date format..."
exit 1
fi
#开始计算日期
declare -i date_dem=`date --date="$date2" +%s` #退伍日期秒数
declare -i date_now=`date +%s` #现在日期秒数
declare -i date_total_s=$(($date_dem-$date_now)) #剩余日期秒数
declare -i date_d=$(($date_total_s/60/60/24)) #转为日期
if [ "$date_total_s" -lt "0" ]; then
echo "You had been demobilization before: " $((-1*$date_d)) "ago"
else
declare -i date_h=$(($(($date_total_s-$date_d*60*60*24))/60/60))
echo "You will demobilize after $date_d days and $date_h hours"
fi
利用case...esac判断,语法如下:
case $变量名称 in
"第一个变量内容") 每个变量内容建议用双引号括起来,关键字为小括号)
程序段
;; 每个类型结尾用两个连续的分号来处理
"第二个变量内容")
程序段
;;
*) 最后一个变量内容都会用*来代表所有其他值
不包含第一个变量内容与第二个变量内容的其他程序执行段
exit 1
;;
esac 注意结尾,反过来写
例如上面输入参数hello的例子改写为:
#/bin/bash
case $1 in
"hello")
echo "Hello, how are you?"
;;
"")
echo "you must input a param, ex> {$0 someword}"
;;
*)
echo "Usage $0 {hello}"
exit 1
;;
esac
function函数语法:
function fname(){
程序段
}
因为shell的执行是从上到下,由左到右,所以function的设置一定要在程序的最前面。函数也拥有内置变量,内置变量的表示与shell script很类似,函数名表示$0, 后续的变量用$1, $2...表示。要注意搞清楚。简单的例子:
#/bin/bash
function printit()
{
echo "Your choice is $1" #函数的参数
}
case $1 in
"one")
printit 1 #1为传减去的函数的参数
;;
"two")
printit 2
;;
"three")
printit 3
;;
*)
echo "Usage $0 {one|two|three}"
;;
esac
循环,while do done, until do done,不定循环,以下语法规则:
当条件成立时循环,不成立时跳出
while [ condition ] 判断式
do
程序段落
done 循环结束
until相反,条件成立时就终止,不成立时则继续循环
until [ condition ]
do
程序段落
done
如以下小例子:
#/bin/bash
#计算1+2+3+...+100
sum=0
val=0
while [ "$val" -lt "100" ]
do
sum=$(($sum+$val))
val=$(($val+1))
done
echo "1+2..+100 is: " $sum
for...do...done(固定循环),语法:
for val in con1 con2 con3...
do
程序段
done
如以下几个例子:
#/bin/bash
#利用cut取出/etc/passwd中的账户名,对每个用户名执行id与finger
for user in $(cat "/etc/passwd" | cut -d':' -f1)
do
id $user
finger $user
done
#/bin/bash
#ping 192.168.1.1-192.168.1.100网址,测试联通情况
network="192.168.1"
for sitenu in $(seq 1 100) #seq产生连续数据
do
#取得ping的回传值是正确还是失败
ping -c 1 -w 1 ${network}.${sitenu} &> /dev/null && result=0 || result=1
if [ "$result" == 0 ];then
echo "server ${network}.${sitenu} is UP"
else
echo "server ${network}.${sitenu} is DOWN"
fi
done
for...do...done的数值处理,语法:
for ((初始值; 限制值; 执行步长))
do
程序段
done
例子:
#/bin/bash
#输入一个数,计算1到该数的和
read -p "please input a number: " num
sum=0;
for (( i=1; i<=$num; i++ ))
do
sum=$(($sum+$i))
done
echo "1到$num的和为:" $sum
shell的追踪与调试,有以下命令:
sh [-nvx] scripts.sh
-n:不要执行script,仅查询语法问题
-v:在执行script前,先将script的内容输出到屏幕上
-x:将使用到的script内容显示到屏幕上。会将全部执行过程列出来,很有用
shell script用在系统管理上是很好的一项工具,但是用在处理大量数值运算上就不够好,因为shell scripts的速度较慢,且使用的cpu资源较多,造成主机资源的分配不良。脚本的执行至少需要有r权限,若要直接命令指向,则需要拥有r与x权限。
若要进行判断,可以用test或中括号[]来进行。