Shell 流程控制 if while for

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

输出结果:

两个数字相等!

#!/bin/bash
read -p ‘your score: ‘ score

if [ $score -ge 90 ];then
echo ‘优秀‘
elif [ $score -ge 70 -a $score -lt 90 ];then
echo ‘良好‘
elif [ $score -ge 60 -a $score -lt 70 ];then
echo ‘一般‘
elif [ $score -lt 60 ];then
echo ‘较差‘
fi

查询成绩

#!/bin/bash
age=87
read -p ‘num: ‘ n

if [ $n -eq $age ];then
echo ‘you get it‘
elif [ $n -gt $age ];then
echo ‘too big‘
elif [ $n -lt $age ];then
echo ‘too small‘
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 i in {1..10}
do
echo $i
done
for i in 1 2 3
for i in {1,2,3}
for i in {1..9}
for i in {9..1}
for i in {a..z}
for i in {A..Z}
for i in {X..Z}
for i in $(cmd)
for i in $(find ...)
检查内网存活的IP
    #!/bin/bash

    for i in {1..254}
    do
            (ping -W 1 -c 1 192.168.1.$i &> /dev/null && echo 192.168.1.$i) &
    done

    让文件测试脚本支持多个参数
    #!/bin/bash

    for i in [email protected]
    do
      if [[ -d $i ]]
      then
        echo "$i is directory."
      elif [[ -b $i  ]]
      then
        echo "$i is block device."
      elif [[ -f $i ]]
      then
        echo "$i is a regular file."
      else
        echo "unknow."
      fi
    done

顺序输出字符串中的字符:

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/sh
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> 退出
输入你最喜欢的电影名: w3cschool菜鸟教程
是的!w3cschool菜鸟教程 是一部好电影

无限循环

无限循环语法格式:

while :
do
    command
done

或者

while true
do
    command
done

或者

for (( ; ; ))
#!/bin/bash
while :
do
read -p ‘please input your name: ‘ name
read -p ‘please input your password: ‘ pwd
if [ $name = ‘egon‘ ] && [ $pwd = ‘123‘ ]
then
echo ‘login sucessful‘
break #continue
fi
done
[[email protected]-R3-srv ~]# ./login.sh
please input your name: egon
please input your password: 123
login sucessful

wihle和read实现逐行处理

[[email protected] ~]# cat 1.sh
#!/bin/bash
while read var
do
    echo $((++i)):$var
done</etc/passwd

[[email protected]-R3-srv ~]# ./1.sh
1:root:x:0:0:root:/root:/bin/bash
2:bin:x:1:1:bin:/bin:/sbin/nologin
3:daemon:x:2:2:daemon:/sbin:/sbin/nologin
4:adm:x:3:4:adm:/var/adm:/sbin/nologin
...........

until 循环

until循环执行一系列命令直至条件为真时停止。

until循环与while循环在处理方式上刚好相反。

一般while循环优于until循环,但在某些时候—也只是极少数情况下,until循环更加有用。

until 语法格式:

until condition
do
    command
done

条件可为任意测试条件,测试发生在循环末尾,因此循环至少执行一次—请注意这一点。


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。

多个for嵌套
嵌套for中使用

continue:默认退出本次循环

break:默认退出本层循环

#!/bin/bash
dir=‘/dev‘
for i in `ls $dir`
do
    if [ -b $dir/$i ]
    then
        ((block++))
    elif [ -f $dir/$i ]
    then
        ((file++))

    elif [ -d $dir/$i ]
    then
        ((directory++))
    else
        ((unkown++))
    fi
done

echo ‘block‘ $block
echo ‘regular file‘ $file
echo ‘directory‘ $directory
echo ‘unkown‘ $unkown

以直接在命令行写for循环

# for i in {1..10};do [ $i -eq 5 ] && continue || echo $i;done
# for i in {1..10};do [ $i -eq 5 ] && break || echo $i;done

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 "Game is over!" 永远不会被执行。


esac

case的语法和C family语言差别很大,它需要一个esac(就是case反过来)作为结束标记,每个case分支用右圆括号,用两个分号表示break

#!/bin/bash
echo "script name: `basename $0`"
echo "version 1.0"
echo "date 2017-03-23"
echo "Author: biubiu"
while read -p "(h for help): " var
do
    case $var in
        p|P|cpu|CPU)
            echo -e "\n\n"
            grep ‘model name\|cpu MHz\|processor‘ /proc/cpuinfo |sort |uniq
            echo -e "\n\n"
        ;;
        m|m|mem|MEM)
            echo -e "\n\n"
            free
            echo -e "\n\n"
        ;;
        d|D|disk|DISK)
            echo -e "\n\n"
            df -Th
            echo -e "\n\n"
        ;;
        h|H|help|HELP)
            echo -e "\n\tcommand\taction\n\n"
            for i in cpu mem disk
            do
            echo -e "\t$i\t${i}_info"
            done
            echo -e "\thelp\tthis help page.."
            echo -e "\tquit\texit !!.."
            echo -e "\n\n"
        ;;
        q|Q|quit|exit)
            exit
        ;;
        *)
            echo -e "\n$var Enter Error...\n"
    esac
done

  

# cat select.sh
#!/bin/bash

PS3=‘choose one: ‘ #select 默认使用PS3做提示符
echo
select var in $(for i in {A..D};do echo $i;done)
do
echo
echo "your choose is $var"
echo "OK"
echo
break # 跳出select,否则是死循环
done
#
# ./select.sh

1) A
2) B
3) C
4) D
choose one: 3

your choose is C
OK

#
若省略 in list 则把 [email protected] 做列表项
# cat select.sh
#!/bin/bash

PS3=‘choose one: ‘
echo
select var
do
echo
echo "your choose is $var"
echo "OK"
echo
break
done
#
# ./select.sh A B C D

1) A
2) B
3) C
4) D
choose one: C

your choose is
OK

了解:select 菜单

  

时间: 2024-11-05 16:35:24

Shell 流程控制 if while for的相关文章

linux shell 流程控制

linux shell 流程控制 导读 和Java.PHP等语言不一样,linux shell有一套自己的流程控制语句,其中包括条件语句(if),循环语句(for,while),选择语句(case).下面我将通过例子介绍下,各个语句使用方法. 一.shell条件语句(if用法) if语句结构[if/then/elif/else/fi] if 条件测试语句 then action [elif 条件 action else action ] fi shell命令,可以按照分号分割,也可以按照换行符分

Linux shell 流程控制(条件if,循环for,while)

Linux shell 流程控制(条件if,循环[for,while],选择[case]语句实例 linux shell有一套自己的流程控制语句,其中包括条件语句(if),循环语句(for,while),选择语句(case).下面我将通过例子介绍下,各个语句使用方法. 一.shell条件语句(if用法) if语句结构[if/then/elif/else/fi] if 条件测试语句 then action [elif 条件 action else action ] fi 如果对于:条件测试语句不是

Shell 流程控制

Shell 流程控制 和Java.PHP等语言不一样,sh的流程控制不可为空,如(以下为PHP流程控制写法): <?php if (isset($_GET["q"])) { search(q); } else { // 不做任何事情 } 在sh/bash里可不能这么写,如果else分支没有语句执行,就不要写这个else. 写成一行(适用于终端命令提示符): if [ $(ps -ef | grep -c "ssh") -gt 1 ]; then echo &q

Shell流程控制

防伪码:床前明月光,疑是地上霜. 流程控制是改变程序运行顺序的指令. f 4.1 if  语句 格式:if list; then list; [ elif list; then list; ] ... [ else list; ] fi 4.1.1 单分支 if 条件表达式; then 命令 fi 示例: #!/bin/bash N=10 if [ $N -gt 5 ]; then echo yes fi # bash test.sh yes 4.1.2 双分支 if 条件表达式; then 命

第四章 Shell流程控制

流程控制是改变程序运行顺序的指令. 4.1 if语句 4.1.1 单分支 if 条件表达式; then     命令 fi 示例: #!/bin/bash N=10 if [ $N -gt 5 ]; then     echo yes fi # bash test.sh yes 4.1.2 双分支 if 条件表达式; then     命令 else     命令 fi 示例: #!/bin/bash N=10 if [ $N -lt 5 ]; then     echo yes else   

Bash Shell 流程控制 —— select

前言 今天刚好写了一个自动化打包脚本,再次使用到了bash shell,好幸福的感觉.这里主要是想介绍一下select命令,这个命令可以帮助我们完成菜单选择功能. 格式 我今天也是第一次使用select流程控制,在php.Java.C这些语言中并没有实现select功能.Bash Shell中,select格式如下: select $var in ${list[@]} do statements that can use $var done 在select执行时,会根据list数组给出选择菜单,

shell--8、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    ...     comma

shell - 流程控制if

流程控制if 字符比较 1. [ "$a" == "$b"] 2. != 不等于 3. -z 字符串长度为零为真 4. -n 字符串长度不为空则为真 [ -n "$a" ] 5. str1>str2 # 多条件对比 a : and o : or [ 1 -lt 2 -a 5 -lt 10];echo $? # 正则对比会使用 [[]] && 且 || 或 [[ 1 -lt 5 || 5 -gt 10 ]];echo $? 例

linux shell学习之shell流程控制

在linux shell编程中,流程控制结构与语句,也算是shell脚本中的重点了,不了解的朋友,跟随脚本小编一起来学习下吧. linux控制流结构学习. 一,shell控制流结构 1.控制结构   6.while循环 2.if then else语句 7.until循环 3.case 语句  8.break控制 5.for循环    9.continue控制 1,if then else  if 条件1 如果条件1为真  then 那么  命令1 执行命令1  elif 条件2 如果条件1不成

Linux Shell——流程控制

一. 创建交互式脚本 使用 echo命令的选项 关于各种命令的使用,可以使用man 命令来查看命令的详细用法介绍.例如,我想看下 echo 的用法和各种选项.可以执行 man echo.执行结果如下: 如果单独执行 echo 命令,就会打印出一个空白行.默认情况下,echo 都会换行,如果不想换行的话,可以使用下面两种方式的一种. echo -n "Which directory do you want to use? " echo -e "Which directory d