Linux之shell(三),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或中括号[]来进行。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值