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" ;; esac5、循环执行
(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分支与循环的主要内容,如果未能解决你的问题,请参考以下文章