您的位置:首页 > 运维架构 > Shell

Shell分支与循环

2016-09-06 09:55 225 查看
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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Shell循环 Shell分支