shell学习笔记(四)shell控制流结构

简介:

shell学习笔记(四)shell控制流结构目录:

=======================================================

条件语句
    if语法结构
循环语句
    for语法结构
        1.for … in 语句
        2.for((赋值;条件;运算语句)) 
    while语法结构
    until语法结构
    break和continue控制
选择语句
    case语法结构

========================================================

条件语句
if语法结构
 
if  条件1    如果条件1为真
then         那么
action command1       执行命令1
elif 条件     如果条件1不成立
then         那么
action command 2       执行命令2
else         如果条件1与条件2都不成立
action command 3      执行命令3
fi           完成
--------------------------------------------------------------
eg:
 
[root@viong_app1 soft]#  cat if.sh
#!/bin/sh
 
scores=85;
if [ $scores -gt 90 ]; then    #[ ]中的值必须是[空格expression空格]
    echo "very good!";
elif [ $scores -gt 80 ]; then
    echo "good!";
elif [ $scores -gt 60 ]; then
    echo "pass!";
else
    echo "no pass!";
fi;
 
 
 [root@viong_app1 soft]#  chmod 755 if.sh
[root@viong_app1 soft]#  ./if.sh
good!
--------------------------------------------------------------
 
[root@viong_app1 soft]#  cat if1.sh
#!/bin/bash
echo -n "Enter you name:"
read NAME
if [ -z $NAME ] || [ "$NAME" = "" ];then
echo "You don't enter a name"
elif [ "$NAME" = root ];then
echo "hello root"
else
echo "hello $NAME"
fi
 
[root@viong_app1 soft]# ./if1.sh    输入为root则打印echo hello root
Enter you name:root
hello root
 
[root@viong_app1 soft]# ./if1.sh  输入为任意字符未匹配1 2 条件则echo hello $NAME
Enter you name:viong
hello viong
 
[root@viong_app1 soft]# ./if1.sh    输入为空字符或者空格则打印echo You don't enter a name
Enter you name:
You don't enter a name
 
简单结构:
 
if 条件1         如果条件1为真
then              那么
action command 1 执行命令1
fi                 完成
eg:
 
[root@viong_app1 soft]#  if [ 10 -lt 21 ];then echo "YES";fi;
YES
 
条件测试有:[[]],[],test 这几种,注意:if与[ ]用空格分开,[ ]与变量之间用空格分开
            [ ]内是整数时不能使用条件运算符
shell命令,可以按照分号分割,也可以按照换行符分割。如果想一行写入多个命令,可以通过“';”分割
 
循环语句
 
for语法结构
 1.for … in 语句
for 变量 in 列表
do
action command1
action command2
done
 
当变量值在列表里,for循环即执行一次所有命令,使用变量名访问列表中取值
只要用 空格字符分割,每次for…in 读取时候,就会 按顺序将读到值,给前面的变量
命令可为任何有效的shell命令和语句
变量名为任何单词
in列表用法是可选,如果不用它,for循环使用命令行的位置参数
in列表可以包含替换,字符串和文件名
 
[root@viong_app1 soft]#  cat for.sh
#!/bin/bash
#for
for abc in {1..5}
do
echo $abc
done
[root@viong_app1 soft]#  ./for.sh
1
2
3
4
5
这脚本实现相当于seq命令
[root@viong_app1 soft]# seq 5
1
2
3
4
5
------------------------------------------------------
[root@viong_app1 soft]#  cat for.sh
#!/bin/bash
#for
for abc in “lin hong viong” 注意:如果把双引号去掉就变成三个字符换行打印出来
do
echo $abc
done
[root@viong_app1 soft]# ./for.sh
lin hong viong
 
2.for((赋值;条件;运算语句))
for((赋值;条件;运算语句))
do
action command
done;
eg:
 
[root@viong_app1 soft]#  cat for2.sh
#!/bin/bash
for ((i=1;i<=10;i++))
do
echo $i
done
[root@viong_app1 soft]#  ./for2.sh
1
2
3
4
5
6
7
8
9
10
 
while语法结构
while action command1
do
action command2
action command3
done
 
注:在while 和do 之间虽然通常只使用一个命令,但可以放几个命令,命令通常用作测试条件
 
eg:
 
[root@viong_app1 soft]#  cat ./while.sh
#!/bin/bash
i=5
while [ $i -ge 1 ]
do
echo $i
((i--))          #必须是双括号或者[ i-- ]
done
[root@viong_app1 soft]#  ./while.sh
5
4
3
2
1
------------------------------------------------------
 
[root@viong_app1 soft]#  cat while2.sh
#!/bin/bash
echo "按住<ctrl>+D退出输入."
while echo -n "输入你最喜欢的电影:";read FILM
do
echo "Yeah,$FILM是一部好电影!"
done
 
[root@viong_app1 soft]#  ./while2.sh
按住<ctrl>+D退出输入.
输入你最喜欢的电影:铁甲钢拳
Yeah,铁甲钢拳是一部好电影!
输入你最喜欢的电影:[root@viong_app1 soft]#
 
[root@viong_app1 soft]# cat name
1
2
3
4
5
6
[root@viong_app1 soft]# cat while1.sh
#!/bin/bash
while read LINE
do
echo $LINE
done<name
[root@viong_app1 soft]# ./while1.sh
1
2
3
4
5
6
 
如果把name放在 while read LINE<name只会无次数地循环显示第一行,即1
 
until语法结构
until 条件
do
action command 1
action command 2
done
 
注意:条件可为任意测试条件,测试发生在循环末尾,因此循环至少执行一次
 
until提供循环执行,它与while循环相反,  until 循环将反复执行直到条件为真就结束循环,而while循环条件为假就结束循环。until并没有等价的while那么好用,而且许多shell版本不支持,BASH支持,所以很多程序员不喜欢用
eg:
 
[root@viong_app1 soft]# cat until.sh
#!/bin/bash
X=1
until (( X > 10 ))
do
       echo hello X is $X
       let X=X+1
done
 
[root@viong_app1 soft]# ./until.sh
hello X is 1
hello X is 2
hello X is 3
hello X is 4
hello X is 5
hello X is 6
hello X is 7
hello X is 8
hello X is 9
hello X is 10
break和continue控制
 
break [n]
退出循环
如果是在一个嵌入循环里,可以指定n来跳出的循环个数
eg:
 
[root@viong_app1 soft]#  cat break.sh
#!/bin/bash
#break
while : #冒号代表一直为真,一直循环下去
do
            echo -n "Enter any Nun[1..5]:"
            read NUN
            case $NUN in
            1|2|3|4|5)
            echo "You enter a number between 1 and 5"
            ;;
        *)  
             echo "Wrong number.bye"
             break
             ;;
   
             esac
done             
 
[root@viong_app1 soft]#  ./break.sh
Enter any Nun[1..5]:1
You enter a number between 1 and 5
Enter any Nun[1..5]:2
You enter a number between 1 and 5
Enter any Nun[1..5]:a
Wrong number.bye
-----------------------------------------
continue
跳出循环步
 
注:continue命令类似于break命令,只有一点重要差别,它不会跳出循环,只是跳出这个循环步 
eg:
 
[root@viong_app1 soft]#  cat continue.sh
#!/bin/bash
#continue
while : #冒号代表一直为真,一直循环下去
do
            echo -n "Enter any Nun[1..5]:"
            read NUN
            case $NUN in
            1|2|3|4|5)
                         echo "You enter a number between 1 and 5"
                         ;;
            *)  
                          echo "Wrong number,continue(y/n)?:"
                          read CONTINUE
                          case $CONTINUE in
                          y|yes|Y|yes)
                          continue
                          ;;
                       *)
                          break
                           ;;
                           esac
              esac
done 
 
[root@viong_app1 soft]#  ./continue.sh
Enter any Nun[1..5]:3
You enter a number between 1 and 5
Enter any Nun[1..5]:a
Wrong number,continue(y/n)?:
y
Enter any Nun[1..5]:b
Wrong number,continue(y/n)?:
n
 
选择语句
case语句为多选择语句,可以用case语句匹配一个值与一个模式,如果匹配成功,执行相匹配的命令
 
case语法结构
case 值 in
模式1)
 action command 1
   ;;
模式2)
 action command 2
   ;;
esac
 
case取值后面必须为单词in,每一模式必须以右括号”)”结束,取值可以为变量或常数,匹配发现取值符合某一模式后,其间所有命令开始执行直至两个分号 ;; .模式匹配符*表示任意字符,?表示任意单字符,[.. ]表示类或范围中任意字符
 
eg:
 
[root@viong_app1 soft]# cat case.sh
#!/bin/bash
FRUIT= $1      
if [ -z "$1" ]        
then
echo "没有在第一个参数输入水果"
else
case "$FRUIT" in
apple|APPLE) echo "THE FRUIT is apple";;
banana|BANANA) echo "THE FRULT is banana";;
*) echo "输入的是不是我要的水果啊?";;
esac
fi
 
[root@viong_app1 soft]# ./case.sh
没有在第一个参数输入水果
[root@viong_app1 soft]# ./case.sh apple
THE FRUIT is apple
[root@viong_app1 soft]# ./case.sh app
输入的是不是我要的水果啊?
 

$1是外部传参的值,通过这个例子就能想到平时类似server httpd restart命令,就是利用case调用




    本文转自viong 51CTO博客,原文链接:http://blog.51cto.com/viong/894438,如需转载请自行联系原作者




相关文章
|
4月前
|
Shell Linux C++
Linux C/C++ 开发(学习笔记二):Shell脚本编程案例
Linux C/C++ 开发(学习笔记二):Shell脚本编程案例
44 0
|
9月前
|
Shell
shell脚本中的控制流示例
shell脚本中的控制流示例
32 5
|
4月前
|
Java Shell Linux
Shell编程 学习笔记
Shell编程 学习笔记
69 1
|
5月前
|
Shell
shell结构控制
shell结构控制
33 1
|
5月前
|
Shell Linux Perl
shell 学习笔记
shell 学习笔记
51 1
|
7月前
|
Shell Linux Go
《Linux操作系统编程》第八章 Shell程序设计: shell 语言结构,包括测试、分支、循环、跳转、函数、语句组
《Linux操作系统编程》第八章 Shell程序设计: shell 语言结构,包括测试、分支、循环、跳转、函数、语句组
72 0
|
Java 大数据 Shell
Azkaban--使用实战--shell、command 调度 | 学习笔记
快速学习 Azkaban--使用实战--shell、command 调度
673 0
Azkaban--使用实战--shell、command 调度 | 学习笔记
|
10月前
|
运维 Shell C语言
shell脚本介绍、结构和执行、变量及date命令用法
shell脚本介绍、结构和执行、变量及date命令用法
144 2
|
12月前
|
Shell 开发工具 Perl
shell学习笔记
shell学习笔记
|
SQL Shell PHP
某教程学习笔记(一):19、任意文件上传和sql语句拿shell
某教程学习笔记(一):19、任意文件上传和sql语句拿shell
80 0
某教程学习笔记(一):19、任意文件上传和sql语句拿shell