Shell 流程节制

和Java、PHP等说话不一样,sh的流程节制不可为空,如(以下为PHP流程节制写法):

<?php
if (isset($_GET"q")) {
    search(q);
}
else {
    // 不做任何任务
}

在sh/bash里可不能这么写,若是else分支不语句履行,就不要写这个else。


if else

if

if 语句语法格局:

if condition
then
    command1 
    command2
    ...
    commandN 
fi

写成一行(合用于终端号令提醒符):

if  $(ps -ef | grep -c "ssh") -gt 1 ; then echo "true"; fi

开端的fi便是if倒过去拼写,前面还会碰到近似的。

if else

if else 语法格局:

if condition
then
    command1 
    command2
    ...
    commandN
else
    command
fi

if else-if else

if else-if else 语法格局:

if condition1
then
    command1
elif condition2 
then 
    command2
else
    commandN
fi

以下实例判定两个变量是不是相称:

a=10
b=20
if  $a == $b 
then
   echo "a 即是 b"
elif  $a -gt $b 
then
   echo "a 大于 b"
elif  $a -lt $b 
then
   echo "a 小于 b"
else
   echo "不合适的前提"
fi

输入成果:

a 小于 b

if else语句常常与test号令连系利用,以下所示:

num1=$2*3
num2=$1+5
if test $num1 -eq $num2
then
    echo '两个数字相称!'
else
    echo '两个数字不相称!'
fi

输入成果:

两个数字相称!

for 轮回

与其余编程说话近似,Shell撑持for轮回。

for轮回普通格局为:

for var in item1 item2 ... itemN
do
    command1
    command2
    ...
    commandN
done

写成一行:

for var in item1 item2 ... itemN; do command1; command2… done;

当变量值在列表里,for轮回即履行一次一切号令,利用变量名获得列表中确以后取值。号令可为任何有效的shell号令和语句。in列表能够包罗替代、字符串和文件名。

in列表是可选的,若是不必它,for轮回利用号令行的地位参数。

比方,挨次输入以后列表中的数字:

for loop in 1 2 3 4 5
do
    echo "The value is: $loop"
done

输入成果:

The value is: 1
The value is: 2
The value is: 3
The value is: 4
The value is: 5

挨次输入字符串中的字符:

for str in 'This is a string'
do
    echo $str
done

输入成果:

This is a string

while 语句

while轮回用于不时履行一系列号令,也用于从输入文件中读取数据;号令凡是为测试前提。其格局为:

while condition
do
    command
done

以下是一个根基的while轮回,测试前提是:若是int小于即是5,那末前提前往真。int从0起头,每次轮回处置时,int加1。运转上述剧本,前往数字1到5,而后遏制。

#!/bin/bash
int=1
while(( $int<=5 ))
do
    echo $int
    let "int++"
done

运转剧本,输入:

1
2
3
4
5

以上实例利用了 Bash let 号令,它用于履行一个或多个抒发式,变量计较中不须要加上 $ 来表现变量,详细可查阅:快乐飞艇是犯法的吗:Bash let 号令

while轮回可用于读取键盘信息。下面的例子中,输入信息被设置为变量FILM,按<Ctrl-D>竣事轮回。

echo '按下 <CTRL-D> 加入'
echo -n '输入你最喜好的网站名: '
while read FILM
do
    echo "是的!$FILM 是一个好网站"
done

运转剧本,输入近似下面:

按下 <CTRL-D> 加入
输入你最喜好的网站名:【WEB手艺大学】教程
是的!【WEB手艺大学】教程 是一个好网站

无穷轮回

无穷轮回语法格局:

while :
do
    command
done

while true
do
    command
done

for (( ; ; ))


until 轮回

until 轮回履行一系列号令直至前提为 true 时遏制。

until 轮回与 while 轮回在处置体例上恰好相反。

普通 while 轮回优于 until 轮回,但在某些时辰—也只是少少数环境下,until 轮回加倍有效。

until 语法格局:

until condition
do
    command
done

condition 普通为前提抒发式,若是前往值为 false,则持续履行轮回体内的语句,不然跳出轮回。

以下实例咱们利用 until 号令来输入 0 ~ 9 的数字:

#!/bin/bash

a=0

until  ! $a -lt 10 
do
   echo $a
   a=`expr $a + 1`
done

运转成果:

输入成果为:

0
1
2
3
4
5
6
7
8
9

case

Shell case语句为多挑选语句。能够用case语句婚配一个值与一个形式,若是婚配胜利,履行相婚配的号令。case语句格局以下:

case 值 in
形式1)
    command1
    command2
    ...
    commandN
    ;;
形式2)
    command1
    command2
    ...
    commandN
    ;;
esac

case任务体比方上所示。取值前面必须为单词in,每形式必须以右括号竣事。取值能够为变量或常数。婚配发明取值合适某一形式后,其间一切号令起头履行直至 ;;。

取值将检测婚配的每个形式。一旦形式婚配,则履行完婚配形式响应号令后不再持续其余形式。若是无一婚配形式,利用星号 * 捕获该值,再履行前面的号令。

下面的剧本提醒输入1到4,与每种形式停止婚配:

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

输入不同的内容,会有不同的成果,比方:

输入 1 到 4 之间的数字:
你输入的数字为:
3
你挑选了 3

跳出轮回

在轮回进程中,偶然辰须要在未到达轮回竣事前提时强迫跳出轮回,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

履行以上代码,输入成果为:

输入 1 到 5 之间的数字:3
你输入的数字为 3!
输入 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

运转代码发明,当输入大于5的数字时,该例中的轮回不会竣事,语句 echo "游戏竣事" 永久不会被履行。


case ... esac

case ... esac 与其余说话中的 switch ... case 语句近似,是一种多分枝挑选布局,每个 case 分支用右圆括号起头,用两个分号 ;; 表现 break,即履行竣事,跳出全部 case ... esac 语句,esac(便是 case 反过去)作为竣事标记。

case ... esac 语法格局以下:

case 值 in
形式1)
    command1
    command2
    command3
    ;;
形式2)
    command1
    command2
    command3
    ;;
*)
    command1
    command2
    command3
    ;;
esac

case 后为取值,值能够为变量或常数。

值后为关头字 in,接上去是婚配的各类形式,每形式最初必须以右括号竣事,形式撑持正则抒发式。

实例

#!/bin/sh

site="jishudaxue"

case "$site" in
   "jishudaxue") echo "【WEB手艺大学】教程"
   ;;
   "google") echo "Google 搜刮"
   ;;
   "taobao") echo "淘宝网"
   ;;
esac

输入成果为:

【WEB手艺大学】教程