SHELL控制流结构
man test 可以看见这些
比较符号:-lt小于 -le小于等于 -gt大于 -ge大于等于 -ne不等于 -eq等于
< 小于(需要双括号),如:(("$a" < "$b"))
<= 小于等于(需要双括号),如:(("$a" <= "$b"))
> 大于(需要双括号),如:(("$a" > "$b"))
>= 大于等于(需要双括号),如:(("$a" >= "$b"))
=或==(需要双括号),如:if [ "$a" == "$b" ]
-b file 若文件存在且是一个块特殊文件,则为真
-c file 若文件存在且是一个字符特殊文件,则为真
-d file 若文件存在且是一个目录,则为真
-e file 若文件存在,则为真
-f file 若文件存在且是一个规则文件,则为真
-g file 若文件存在且设置了SGID位的值,则为真
-h file 若文件存在且为一个符合链接,则为真
-k file 若文件存在且设置了"sticky"位的值
-p file 若文件存在且为一已命名管道,则为真
-r file 若文件存在且可读,则为真
-s file 若文件存在且其大小大于零,则为真
-u file 若文件存在且设置了SUID位,则为真
-x file 若文件存在且可执行,则为真
-o file 若文件存在且被有效用户ID所拥有,则为真
-z string 若string长度为0,则为真
-n string 若string长度不为0,则为真
string1 = string2 若两个字符串相等,则为真
string1 != string2 若两个字符串不相等,则为真
if then else语句:
if 条件 1
then 命令1
elif 条件 2
then 命令2
else
命令3
fi 完成
如果if和then在同一行那命令格式为 if 条件1;then
eg:
#####vim name.sh
#!/bin/bash
#name.sh
echo -n "Enter you name:"
read NAME
if [ "$NAME" == " " ]; then
echo "you did not enter you name"
else
echo "you name is: $NAME"
fi
####保存退出,chmod +x name.sh
#### 运行 ./name.sh
[root@localhost ~]# ./name.sh
Enter you name:tony (这个名字你是输入的)
you name is: tony
eg:copy一个文件,如果文件不存在会提示系统错误的信息,和提示自己给的信息
####vim ifcp.sh
#!/bin/bash
#ifcp.sh
if cp test1.txt myfile.txt; then
echo "copy is successful"
else
echo "`basename $0`:no such test1.txt file" >&2
fi
####保存退出,chmod +x ifcp.sh
####运行 ./ifcp.sh -n (-n参数可以检查脚本是否有语法错误)
[root@localhost ~]# ./ifcp.sh
cp: cannot stat `test1.txt': No such file or directory
ifcp.sh:no such test1.txt file
eg:copy一个文件,文件不存在系统提示的信息不显示在屏幕上,显示提示自己给的信息
####vim ifcp.sh
#!/bin/bash
#ifcp.sh
if cp test1.txt myfile.txt 2>/dev/null; then
echo "copy is successful"
else
echo "`basename $0`:no such test1.txt file" >&2
fi
####保存退出,chmod +x ifcp.sh
####运行 ./ifcp.sh
[root@localhost ~]# ./ifcp.sh
ifcp.sh:no such test1.txt file
eg:copy一个文件,文件存在则提示copy is successful
####vim ifcp.sh
#!/bin/bash
#ifcp.sh
if cp 1.txt myfile.txt 2>/dev/null; then
echo "copy is successful"
else
echo "`basename $0`:no such test1.txt file"
fi
####保存退出,chmod +x ifcp.sh
####运行 ./ifcp.sh
[root@localhost ~]# ./ifcp.sh
copy is successful
[root@localhost ~]# cat myfile.txt
the end
解释:`bsename $0`值显示当前脚本或命令的名字,$0显示会包括当前脚本或命令的路径
>&2重定向到标准错误,输出到屏幕上
eg:一个if---elif---elif--else的语句, -z的参数不知道是什么意思,自己可以man test查看一下,注意空格和分号,引号
#####vim ifelse.sh
#!/bin/bash
#ifelse.sh
echo -n "Enter your name:"
read NAME
if [ -z $NAME ] || [ "$NAME" = " " ];then
echo "you did not enter a name"
elif [ "$NAME" = "root" ];then
echo "Hello root"
elif [ "$NAME" = "tony" ];then
echo "Hello tony"
else
echo "hi,$NAME"
fi
####保存退出,chmod +x ifelse.sh
####运行 ./ifelse.sh
[root@localhost ~]# ./ifelse.sh
Enter your name:root
Hello root
[root@localhost ~]# ./ifelse.sh
Enter your name:tony
Hello tony
[root@localhost ~]# ./ifelse.sh
Enter your name:jie
hi,jie
case语句:
case值 in
模式1)
命令1
;;
模式2)
命令2
;;
esac
case取值后面必须为单词in,每一模式必须以右括号结束。取值可以为变量或常数,匹配发现取值符合某一模式后,期间
所有命令开始执行直至;;.模式匹配符合*表示任意字符,?表示任意单字符,[..]表示类或范围中任意字符
eg:
######vim case.sh
#!/bin/bash
#case.sh
echo -n "Enter a number from 1 to 3:"
read ANS
case $ANS in
1)
echo "you select 1"
;;
2)
echo "you select 2"
;;
3)
echo "you select 3"
;;
*)
echo "`basename $0`:this is not between 1 and 3 ">&2
exit
;;
esac
#####保存退出,chmod + case.sh
####运行 ./case.sh
[root@localhost ~]# ./case.sh
Enter a number from 1 to 3:1
you select 1
[root@localhost ~]# ./case.sh
Enter a number from 1 to 3:2
you select 2
[root@localhost ~]# ./case.sh
Enter a number from 1 to 3:3
you select 3
[root@localhost ~]# ./case.sh
Enter a number from 1 to 3:5
case.sh:this is not between 1 and 3
for循环:
for 变量名 in 列表
do
命令1
命令2
done
当变量值在列表里,for循环即执行一次所有命令,使用变量名访问列表中取值,命令可为任何有效的shell命令和语句,变量名
为任何单词,in列表用法是可选的,如果不用它,for循环使用命令行的位置参数。in列表可以包含替换,字符串和文件名。
eg:in后面的参数为一个列表
#####vim for1.sh
#!/bin/bash
#for1.sh
for loop in 1 2 3 4 5
do
echo $loop
done
####保存退出,chmod +x for1.sh
####运行./for1.sh
[root@localhost ~]# ./for1.sh
1
2
3
4
5
eg:in后面的参数为一个字符串
#####vim for2.sh
#for2.sh
for loop in "orange red bue grey"
do
echo $loop“
done
####保存退出,chmod +x for2.sh
####运行./for2.sh
[root@localhost ~]# ./for2.sh
orange red bue grey
把for2.sh里面的内容for loop in "orange red bue grey" 改成for loop in orange red bue greyz则in后面的分行显示
eg:in后面的参数为一个命令,``反引号里面的是系统的命令
#####vim for3.sh
#!/bin/bash
#for3.sh
for jie in `cat myfile.txt`
do
echo $jie
done
####保存退出,chmod +x for3.sh
[root@localhost ~]# cat myfile.txt
the end
[root@localhost ~]# ./for3.sh
the
end
eg:一个for和if结合的列子
####vim for4.sh
#!/bin/bash
#for4.sh
echo "zhe li mian end you yi ge end" >myfile.txt
for JIE in `cat myfile.txt`
do
if [ "$JIE" = "end" ];then
echo "it is:$JIE"
else
echo "it is not end,it is:$JIE"
fi
done
#####保存退出,chmod +x for4.sh
####运行./for4.sh
[root@localhost ~]# ./for4.sh
it is not end,it is:zhe
it is not end,it is:li
it is not end,it is:mian
it is:end
it is not end,it is:you
it is not end,it is:yi
it is not end,it is:ge
it is:end
until循环:
until 条件
do
命令1
命令2
...
done
条件可以为任意测试条件,测试发生在循环末尾,因此循环至少执行一次
eg:检查磁盘空间的大小,每隔300s检查磁盘空间,超过指定的数字就发邮件给root用户
######vim until.sh
#!/bin/bash
#until.sh
Part="/home"
LOOK_OUT=`df | grep "$Part" | awk '{print $5}'| sed 's/%//g'`
echo $LOOK_OUT
until [ " $LOOK_OUT" -gt "90" ]
do
echo "this Filesystem is empty" |mail root
LOOK_OUT=`df | grep "$Part" | awk '{print $5}'| sed 's/%//g'`
sleep 300
done
#####保存退出,chmod +x until.sh
####运行./until.sh
while循环:
while 命令
do
命令1
命令2
...
done
在while和都之间虽然通常指使用一个命令,但可以放几个命令,命令通常用作测试条件
eg:
######vim while.sh
#!/bin/bash
#while.sh
NAME=name.txt
if [ -e "$NAME" ];then
echo -e "zhui jia \n jin qu \n yi juhua " >> $NAME
else
touch $NAME
echo -e "zhe ge wen jian \n shi xin \n jian de " > $NAME
fi
while read LINE
do
echo $LINE
done < $NAME
######保存退出,chmod +x while.sh
####运行 ./while.sh
if [ -e "$NAME" ] //判断这个文件有木有,若果有则会追加一句话,没有则会新建一个文件,然后会添加一句话
然后通过循环把他显示输出,如果没有这个文件,运行第一遍则只会出现echo -e "zhe ge wen jian \n shi xin \n jian de " > $NAME
这个里面的,如果运行第二遍,则 echo -e "zhe ge wen jian \n shi xin \n jian de " > $NAME会显示一次,然后
echo -e "zhui jia \n jin qu \n yi juhua " >> $NAME会输入一次,运行第三遍,则echo -e "zhui jia \n jin qu \n yi juhua " >> $NAME
会显示更多遍
break控制:
退出循环,如果是在一个嵌入循环里,可以指定n来跳出循环的个数,
eg:
######vim break.sh
#!/bin/bash
#break.sh
while :
do
echo -n "Enter any number [ 1...5 ]:"
read ANS
case $ANS in
1|2|3|4|5)
echo "Your enter a number between 1 and 5."
;;
*)
echo "Wrong number,bye."
break
;;
esac
done
######保存退出,chmod +x break.sh
####运行 ./break.sh
[root@localhost ~]# ./break.sh
Enter any number [ 1...5 ]:1
Your enter a number between 1 and 5.
Enter any number [ 1...5 ]:3
Your enter a number between 1 and 5.
Enter any number [ 1...5 ]:7
Wrong number,bye.
解释:while : ,while后面接一个: 表示while语句永远为真,用break跳出循环。
continue控制:
跳过循环步
eg:
#####vim breakcontinue.sh
#!/bin/bash
#break.sh
while :
do
echo -n "Enter any number [ 1...5 ]:"
read ANS
case $ANS in
1|2|3|4|5)
echo "Your enter a number between 1 and 5."
;;
*)
echo -n "Wrong number,continue(y/n?)."
read IS_CONTINUE
case $IS_CONTINUE in
y|yes|Y|Yes)
continue;
;;
*) break
;;
esac
;;
esac
done
######保存退出, chmod +x breakcontinue.sh
#####运行, ./breakcontine.sh
[root@localhost ~]# ./breakcontinue.sh
Enter any number [ 1...5 ]:3
Your enter a number between 1 and 5.
Enter any number [ 1...5 ]:7
Wrong number,continue(y/n?).y
Enter any number [ 1...5 ]:6
Wrong number,continue(y/n?).n
vim check_server.sh
####
#!/bin/bash
echo "this script will to find which service have started"
#to find www service
testing=`netstat -tlun | grep ":80"`
if [ -n "$testing" ];then ##if no null is true
echo "WWW server has started!"
fi
#to find vsftpd service
testing=`netstat -tlun | grep ":21"`
if [ "$testing" != "" ];then ###if no null is true
echo "vsftpd server has started!"
fi
#to find ssh service
testing=`netstat -tlun | grep ":22"`
if [ -n "$testing" ];then
echo "SSH server has started!"
fi
#to find mail service
testing=`netstat -tlun | grep ":25"`
if [ "$testing" != "" ];then
echo "MAIL server has started!"
fi
#####
function功能
格式:
function fname()
{
程序段
}
function的设定一定要在程序的最前面
拥有内建变量,$0表示函数名称,后续接的变量标记为$1,$2,$3....
vim func.sh
###
#!/bin/bash
function printinfo()
{
echo "you choice is"
}
case $1 in
"one")
printinfo;echo $1 | tr -s 'a-z' 'A-Z'
;;
"two")
printinfo;echo $1 | tr -s 'a-z' 'A-z'
;;
esac
####
shell脚本实现1+2+...+100
vim sum.sh
####
#!/bin/bash
i=0
s=0
while [ "$i" -lt 100 ]
do
i=$(($i+1))
s=$(($s+$i))
done
echo "1+2+3+...+$i=$s"
####
vim sum1.sh
####
#!/bin/bash
s=0
for ((i=0;i<=100;i++))
do
s=$(($s+$i))
done
echo "1+2+..+100=$s"
echo "i=$i"
####
for的另一种格式
vim for.sh
####
#!/bin/bash
for animal in cat dog pig
do
case $animal in
"cat")
echo "$animal miao miao jiao"
;;
"dog")
echo "$animal wang wang jiao"
;;
"pig")
echo "$animal luo luo jiao"
;;
"*")
echo "$animal jiao mei jiao"
;;
esac
done
####
本文转自 jie783213507 51CTO博客,原文链接:http://blog.51cto.com/litaotao/1187977,如需转载请自行联系原作者