if condition then statements [elif condition then statements. ..] [else statements ] fi
#!/bin/bash
read -p "please input your name:" NAME ###read命令用于从控制台读取输入数据
printf '%s\n' $NAME
if [ $NAME = root ] ##注意if和后面的[]有间距
then
echo "hello ${NAME},welcome!"
elif [ $NAME = toto ]
then
echo "hello ${NAME},welcome!"
else
echo "SB,get out here!"
fi
脚本内容截图:
1/ 条件判断基本语法
[ condition ] (注意condition前后要有空格)
#非空返回true,可使用$?验证(0为true,>1为false)
[ itcast ]
#空返回false
[ ]
注意[ ]内部的=周边的空格,有区别:
[root@shizhan01 scripts]# if [ a = b ];then echo ok;else echo notok;fi
notok
[root@shizhan01 scripts]# if [ a=b ];then echo ok;else echo notok;fi
ok
短路(理解为三元运算符)
[ condition ] && echo OK || echonotok
条件满足,执行&&后面的语句;条件不满足,执行|| 后面的语句
2/ 条件判断组合
注:[] 与[[ ]] 的区别:[[ ]] 中逻辑组合可以使用 && || 符号
而[] 里面逻辑组合可以用 -a -o
[root@mini ~]# if [ a = b && b = c ]; then echo ok;else echo notok;fi
-bash: [: missing `]'
notok
[root@mini ~]# if [ a = b -a b = b ]; then echo ok;else echo notok;fi
notok
[root@mini ~]# if [ a = b -o b = b ]; then echo ok;else echo notok;fi
ok
[root@mini ~]# if [[ a = b && b = b ]]; then echo ok;else echo notok;fi
notok
[root@mini ~]# if [[ a = b || b = b ]]; then echo ok;else echo notok;fi
ok
3/ 常用判断运算符
字符串比较:= !=
-z 字符串长度是为0返回true
-n 字符串长度是不为0返回true
if [ 'aa' = 'bb' ]; then echo ok; else echonotok;fi
if [ -n "aa" ]; then echo ok;else echo notok;fi
if [ -z "" ]; then echo ok; elseecho notok;fi
整数比较:
-lt 小于
-le 小于等于
-eq 等于
-gt 大于
-ge 大于等于
-ne 不等于
文件判断:
-d 是否为目录
if [ -d /bin ]; then echo ok; else echonotok;fi
-f 是否为文件
if [ -f /bin/ls ]; then echo ok; elseecho notok;fi
-e 是否存在
if [ -e /bin/ls ]; then echo ok; elseecho notok;fi
while expression
do
command
…
done
i=1
while ((i<=3))
do
echo $i
leti++
done
while.sh脚本的内容如下:
#!/bin/bash
i=1
while((i<=3))
do
echo $i
let i++
done
while2.sh的脚本内容如下:
#!/bin/bash
echo '按下 <CTRL-D> 退出'
echo -n '输入你最喜欢的电影名:'
while read FILM
do
echo "是的! $FILM 是一部好电影"
done
Shell case语句为多选择语句。可以用case语句匹配一个值与一个模式,如果匹配成功,执行相匹配的命令。case语句格式如下:
case 值 in 模式1) command1 command2 ... commandN ;; 模式2) command1 command2 ... commandN ;; esaccase工作方式如上所示。取值后面必须为单词in,每一模式必须以右括号结束。取值可以为变量或常量。匹配发现取值符合某一模式后,其间所有命令开始执行直至;;。
取值将检测匹配的每一个模式。一旦模式匹配,则执行完匹配模式相应命令不再继续其他模式。如果无一匹配模式,使用星号*捕获该值,再执行后面的命令。
下面的脚本提示输入1到4,与每一种模式进行匹配:
case.sh案例如下:
#!/bin/bash
echo '输入 1 到 4 之间的数字:'
echo '你输入的数字为:'
read aNum
case $aNum in
1) echo '你选择了 1 '
;;
2) echo '你选择了 2'
;;
3) echo '你选择了 3'
;;
4) echo '你选择了 4'
;;
*) echo '你没有输入 1 到 4之间的数字'
;;
esac
运行结果:
[root@hadoop test]# sh case.sh
输入 1 到 4 之间的数字:
你输入的数字为:
4
你选择了 4
[root@hadoop test]# sh case.sh
输入 1 到 4 之间的数字:
你输入的数字为:
3
你选择了 3
再如例子case2.sh
#!/bin/bash
case $1 in
start)
echo "starting"
;;
stop)
echo "stoping"
;;
*)
echo "Usage:{start | stop}"
esac
运行结果:
[root@hadoop test]# sh case2.sh start
starting
#!/bin/bash
for N in 1 2 3
do
echo $N
done
运行结果:
[root@hadoop test]# sh for.sh
1
2
3
或
#!/bin/bash
for N in {1..5}
do
echo $N
done
运行结果:
[root@hadoop test]# sh for.sh
1
2
3
4
5
再如如下例子:
[root@hadoop test]# ls
a.sh b.sh case.sh for.sh hello.sh login.log while2.sh
break.sh case2.sh continue.sh fortest.sh if.sh test.txt while.sh
[root@hadoop test]# cat fortest.sh
#!/bin/bash
for shname in `ls *.sh`
do
name=`echo "$shname" | awk -F. '{print $1}'`
echo $name
done
[root@hadoop test]# sh fortest.sh
a
break
b
case2
case
continue
for
fortest
hello
if
while2
while
通过shell来统一放开端口
一简单的字符串 枚举遍历法,利用for in格式对字符串按空格切份的功能 SERVICES="80 22 25 110 8000 23 20 21 3306 " for x in $SERVICES do iptables -A INPUT -p tcp --dport $x -m state --state NEW -j ACCEPT done
for ((i = 0; i <= 5; i++))
do
echo"welcome $i times"
done
或
for ((i = 0; i <= 5; i++)); do echo"welcome $i times"; done
定义for2.sh
#!/bin/bash
for ((i=0;i<=5;i++))
do
echo "welcome $i times"
done
运行结果如下:
[root@hadoop test]# sh for2.sh
welcome 0 times
welcome 1 times
welcome 2 times
welcome 3 times
welcome 4 times
welcome 5 times
在循环过程中,有时候需要在未达到循环结束条件时跳出循环,Shell使用两个命令来实现该功能:break和continue。
break命令
break命令允许跳出所有循环(终止执行后面的所有循环)
下面的例子中,脚本进入死循环直到用户输入数字大于5。要跳出这个循环,返回到shell提示符下,需要使用break名。
#!/bin/bash
while :
do
echo -n "输入 1 到 5 之间的数字:"
read aNum
case $aNum in
1|2|3|4|5) echo "你输入的数字为 $aNum!"
;;
*)
echo "你输入的数字不是 1 到 5 之间的!游戏结束"
break
esac
done
执行以上的代码,输入结果为:
[root@hadoop test]# sh break.sh
输入 1 到 5 之间的数字:5
你输入的数字为 5!
输入 1 到 5 之间的数字:7
你输入的数字不是 1 到 5 之间的!游戏结束
continue
continue命令与break命令类似,只有一点差别,它不会跳出所有循环,仅仅跳出当前循环。对上面的例子进行修改:
#!/bin/bash
while :
do
echo -n "输入 1 到 5 之间的数字:"
read aNum
case $aNum in
1|2|3|4|5) echo "你输入的数字为$aNum!"
;;
*) echo "你输入的数字不是 1 到 5 之间的!"
continue
echo "游戏结束"
;;
esac
done
运行代码,结果如下:
[root@hadoop test]# sh continue.sh
输入 1 到 5 之间的数字:7
你输入的数字不是 1 到 5 之间的!
输入 1 到 5 之间的数字:2
你输入的数字为2!
输入 1 到 5 之间的数字:2
你输入的数字为2!
输入 1 到 5 之间的数字:5
你输入的数字为5!