Shell分支与循环

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Shell分支与循环相关的知识,希望对你有一定的参考价值。

1、常用的环境变量

变量名称
说明
示例
PATH

查找所有外部命令的路径集合。

如果没有PATH环境变量,那么执行的所有外部命令都需要说明其文件路径

如果PATH环境变量中所包含及2个以上路径对应同样的同样名称的命令,在执行这个命令时,选选择那个先被找到的文件

echo $PATH

PATH=$PATH:/usr/bin

export PATH

SHELL
当前默认的SHELL环境(Shell程序)


表示上一个命令执行成功或者失败

HOME
用户主目录

特殊的环境变量?:其保存上一个命令执行之后返回给内核的一个整数,我们通常约定,如果一个程序执行成功,则向内核返回0,否则返回非0,这个值的取值是0~255,-128~127。

2、test条件测试命令

    (1)数值比较   test $变量 选项 数字

选项
含义
-lt
小于
-le
小于等于
-gt
大于
-ge
大于等于
-eq
判断是否相等

     (2)字符串问题 test $变量 选项 字符串

"":这个表示空字符串;

选项
含义
=
表示相等
!=
不等
-z
为空
-nz
不为空

    (3)文件问题 test 选项 文件名称

    常用的是 test -e 文件名   (判断文件是否存在的)

[] : 也是条件测试命令,[ : 表示的是外部命令,] : 表示的是选项,所以这两个前后必须空格分开;

3、顺序执行

    按行顺序执行,与文件内容的书写顺序保持一致;

    逐字符扫描和解释的;

4、分支结构

    (1)、if分支

if 任意命令 ; then

    #若干命令

fi

#其它若干命令

#!/bin/bash

read -p "Please Input userAge : " userAge

if test $userAge -lt 20 -a $userAge -gt 18 ; then
    echo "18<userAge<20"
fi

技术分享

if 任意命令

then

    #若干命令

fi

#!/bin/bash

read -p "Please Input userAge : " userAge

if test $userAge -lt 20 -a $userAge -gt 18  
then
    echo "18<userAge<20"
fi

技术分享

if 任意命令 ; then # 若干命令;fi

if [ $userAge -gt 10 -a $userAge -lt 18 ] ; then echo "age too small" ; fi

技术分享

if then fi 都属于bash的内部语法命令,进行语法控制。fi的作用是结束if语句块儿;then可以写在if之后,但必须在其前增加分号,将其前面的命令与之隔开,也可以写在if之下。

if 任意命令

then

    #若干命令

elif 任意命令

then

    #若干命令

fi

#!/bin/bash

read -p "Please Input userAge : " userAge

if test $userAge -lt 20 -a $userAge -gt 18  
then
    echo "18<userAge<20"
elif test $userAge -gt 30
then 
    echo "userAge > 30"
fi

技术分享

if 任意命令

then

    #若干命令

else

    #若干命令

fi

#!/bin/bash

read -p "Please Input userAge : " userAge

if test $userAge -lt 20 -a $userAge -gt 18  
then
    echo "18<userAge<20"
else 
    echo "no range"
fi

技术分享

if的条件判断是通过$?完成的,这是if的内部机理。

    (2)、case分支

case分支的作用和结构与C语言的switch...case语句是类似的。

case $变量 in

    表达式)

    若干语句

    ;;

   表达式)

    若干语句

    ;;

......

esac

case表达式指的是多个常量可以通过或的方式写在一起(使用‘ | ‘表示),提供了一个通配符星号,用于表示default语义的case块。 

case表达式中所给字符串与变量值是进行相等判断的(字符串相等判断);

#!/bin/bash

read -p "Please Input your choose : " choose

case $choose in
    1|2)
        echo "choose 1或2"
    ;;  
    3)  
        echo "choose 3"
    ;;  
    *)  
        echo "no choose"
    ;;  
esac

技术分享

5、循环执行

    (1)、While

while 任意命令 ; do

    #若干命令

done

反单引号:将反单引号中的内容当做命令来执行,然后用该命令的标准输出替换整个反单引号的内容!!!

`echo hello`------->hello

expr是进行各种运算的命令:

技术分享

#!/bin/bash

index=0
while test $index -lt 10
do
    echo $index
    index=`expr $index + 1`
done

技术分享


while 任意命令

do

    #若干命令

done

注意:Shell脚本程序没有do... while循环;

    (2)、for

for循环用于遍历一个字符串(按行遍历),这个字符串包括回车换行;

for 遍历名称 in 若干行字符串

do

    #若干命令

done

#!/bin/bash

for a in `cat ./abc.txt` #将abc.txt的文件中一行一行内容交给a;
do
    echo $a
done

技术分享

6、特殊情况

    (1)、break:跳出break所在当前层的循环;

    (2)、当while遇到管道符

命令 | while read 变量名称

do

    #若干命令

done

通过以上循环可以将管道符之前的命令产生的标准输出按行遍历,其中变量名称保存的就是某一行的内容。

#!/bin/bash

find /usr/include -name "w*.h" | while read filename
do
    cmd=`echo cp $filename ./`  #将``中的标准输出给了cmd;
    $cmd  #每次将一个文件拷贝到当前目录下;
done    #ls -1是竖着打印文件名称

技术分享

    (3)、当while遇到重定向输入

while read 变量名称

do

    #若干命令

done < 文件

就是从文件中一行一行的读取文件内容;

#!/bin/bash

while read filename
do
    echo $filename
done < ./abc.txt

技术分享

等价于下面的写法:

for 变量名称 in `cat 文件名称`

do

    #若干命令

done



本文出自 “11586096” 博客,请务必保留此出处http://11596096.blog.51cto.com/11586096/1846675

以上是关于Shell分支与循环的主要内容,如果未能解决你的问题,请参考以下文章

Shell中分支与循环结构

你该认识这样的Linux_shell之变量操作符与循环分支

shell脚本编程学习笔记-分支与循环结构

Python条件与循环

Shell编程之case语句与循环语句

Shell编程之case语句与循环语句