Shell中有三种类型的循环:for, until, while,具有3种类型的条件语句:if, case, 条件操作符(&&, ||)。

1. 结束码

命令的结束码可以在命令运行完后,查看$?查看。当命令执行正常时,结束码为0,当异常时,返回1-255的数字。

$ printf "%v\n"
-bash: printf: `v': invalid format character
$ echo $? $ mkdir /qwerty
mkdir: cannot create directory `/qwerty': Permission denied
$ echo $?
 

2. test命令

test命令用于计算多种表达式,包括文件属性,整型,字符串等。与test对应的,常见有两种符号:[[和((。其中((用于测试数值表达式,[[ ... ]]用于测试正则表达式。具体可以查看man test。

注意:[ test和[test是2个概念,bash对于空格比较敏感。

(1) 文件测试

a. -e: 表示文件是否存在

b. -f: 检查文件是否存在并且是否为普通文件

c. -d: 检查是否为文件夹

-h, -L: 是否为符号链接

$ test -f /etc/fstab # 当为普通文件时为true
$ echo $? $ test -h /etc/rc.local # 当为软连接时为true
$ [ -x "$HOME/bin/hw" ] # 当指定文件可执行时为true
$ [[ -s $HOME/bin/hw ]] # 当文件存在且非空时为true 

(2) 整型测试

整型比较常见符号有-eq, -ne, -gt, -lt, -le

$ test  -eq  # 测试是否相等
$ echo $? $ [ -eq ]
$ echo $? $ [ -ne ] # 测试不等
$ echo $?
 

(3) 字符串测试

a. =:字符串相等,等同于" == ",例:test "$a" = "$b"

b. != : 字符串不相等,例:[ "$q" != "$b" ]

c. -z : 字符串是否为空,例:[ -z "" ]

d. -n : 字符串是否非空,例:test -n ""

e. 字符串比较大小,注意 >, <防止被解释为重定向。例:

$ str1=abc
$ str2=def
$ test "$str1" \< "$str2"
$ echo $? $ test "$str1" \> "$str2"
$ echo $?
 

f. -a : 逻辑与,等同于" && ",例:test -f /path/to/file -a $test -eq 1

g. -o : 逻辑或,等同于" || ",例:test -x bin/file -o $test -gt 1

3. [[ ... ]] : 计算一个表达式

如:[[ -f music_job.zip && 1 -eq 1 ]]

[[ ... ]]有个特征,即通过使用=~操作符来匹配正则表达式。

$ [[ $string =~ h[aeiou] ]]
$ echo $? $ [[ $string =~ h[sdfghjkl] ]]
$ echo $?
 

4. (( ... )):计算算术表达式

((  算数表达式 )),当其中的算术表达式计算为0时,返回false,否则为true。例:

$ test $(( a -  )) -ne
$ [ $a != ] 

由于(( ... ))是shell语法而非内置命令,因此 >, <符号将不会被当做重定向符。

例a:if (( total > max )); then: ...; fi

例b: (( verbose )) && command ## 当verbose != 0时,执行command命令

在(( ... ))中如果存在非数值,则默认结果为0,例:

$ y=yes
$ ((y)) && echo $y || echo n

注意:当(( ... ))中的变量代表数字时,可省略$符号

5. 条件执行

(1) if

格式为:

if <condition list>
then
<list>
fi 

示例:

example :
read name
if [[ -z $name ]];then
echo "No name enterd" >&
exit
fi example :
printf "Enter a number not greater than 10: "
read number
if (( number > ));then
printf "%d is too big\n" "$number" >&
exit
else
printf "You entered %d\n" "$number"
fi example :
printf "Enter a number between 10 and 20 inclusive: "
read number
if (( number < )); then
printf "%d is too low\n" "$number" >&
exit
elif (( number > ));then
printf "%d is too high\n" "$number| >&2
exit
else
printf "You entered %d\n" "$number"
fi 

(2) 条件操作符&&, ||

包含&&, ||条件运算符的列表将从左向右依次执行。只有&&前的命令执行成功,才会执行&&后的命令;只有||前的命令执行失败,才会执行||后的命令。

例a:test -d "$director" && cd "$director" ## 检测目录存在,才会进入

例b: cd "$HOME/bin" || exit 1 ## 进入bin目录失败时,将会退出

例c: mkdir "$HOME/bin" && cd "$HOME/bin" || exit 1 ## 创建bin目录失败或进入bin目录失败,将退出

例:

if [ -d "$dir" ] && cd "$dir";then
echo "$PWD"
fi 

(3) case

格式为:

case WORD in
PATTERN) COMMANDS ;;
PATTERN) COMMANDS ;;
esac 

例:case用于检测字符串是否包含:

case $ in
*"$2"*) echo "true" ;;
*) echo "false" ;;
esac 

例:case用于判断数值是否有效

case $ in
*[!-]*) false ;;
*) true ;;
esac 

例:判断参数的个数

case $# in
) ;; ## We need args, so do nothing
*) printf "%s\n" "Please provide three names" >&
exit
;;
esac 

6. 循环

(1) while

格式为:

while <list>
do
<list>
done 

例:累加

n=
while [ $n -le ]
do
n=$(( $n + ))
done 

例:true条件则无限循环

while true
do
read x
done 

例:从文件中逐行读取

while IFS= read -r line
do
: do something with "$line"
done < FILENAME? 

(2) until

until与while相反,当循环条件失败时结束。例:

n=
until [ $n -gt ]
do
echo "$n"
n=$(( $n + ))
done 

(3) for

for var in Canada USA Mexico
do
printf "%s\n" "$var"
done 

另一种格式:

for (( n=; n<=; ++n))
do
echo "$n"
done 

(4) break

while :
do
read x
[ -z "$x" ] && break #输入为空字符串时,退出
done 

break后如果带有数值,则表示可以跳出多次嵌套的循环:

for n in a b c d e
do
while true
do
if [ $RANDOM -gt ];then
printf .
break # 跳出while以及for循环
elif [ $RANDOM -lt ];then
printf '"'
break ## 仅跳出while循环
fi
done
done
echo 

(5) continue

for n in {..}
do
x=$RANDOM
[ $x -le ] && continue
echo "n=$n x=$x"
done

Bash编程(2) 循环与分支的更多相关文章

  1. bash 编程中循环语句用法

    1.if 是单分支语句,使用格式如下: if condition ; then statement ….. fi 2.if … else 是双分支语句,使用格式如下: if condition ; t ...

  2. bash编程之多分支if 语句及for循环

    第十七章.bash编程之多分支if 语句及for循环 if语句三种格式 多分支if语句练习 for循环 17.1.if语句的三种格式 单分支if语句 if condition;then 条件为真执行的 ...

  3. bash编程总结

    bash应该是目前Linux上最流行的shell脚本解释程序了(还有个shell叫dash,我太讨厌这个东东了.),只要你在linux上工作,并且希望自己能够工作得更愉悦,那么你应该熟悉最基本的bas ...

  4. bash编程基础

    bash变量 变量命名: 1.不能使用程序中的关键字(保留字) 2.只能使用数字.字母和下划线,且不能以数字开头 3.要见名知义 变量类型: 数值型:精确数值(整数),近似数值(浮点型) 字符型:ch ...

  5. Linux Bash编程

    在Linux系统介绍中,介绍了shell的多个版本,现在的Linux发行版基本都默认使用bash(Bourne Again shell),兼容Bourne shell (sh),本文将简要介绍Bash ...

  6. bash while/until循环学习

    while循环:条件满足,则循环:失败,则退出 如何退出? 必须有时刻,条件测试不成功 ? :条件控制变量 while 条件测试:do 循环体 done until循环:条件不满足,则循环:否则,退出 ...

  7. Linux中bash编程

    bash编程也叫shell编程 预定义变量         $? 最后一次执行的命令的返回状态.如果这个变量的值为0,证明上一个命令正确的执行:如果这个变量返回的值非0(具体是那个数,有命令自己来决定 ...

  8. 04 shell编程之循环语句

    Shell编程之循环语句 学习目标: 掌握for循环语句编程 掌握while循环语句编程 目录结构: For循环语句 l  读取不同的变量值,以逐个执行同一组命令 l  For语句结构 for 变量名 ...

  9. bash编程之循环控制:

    bash编程之循环控制: for varName in LIST; do 循环体 done   while CONDITION; do 循环体 done   until CONDITION; do 循 ...

随机推荐

  1. await Task传异步Lambda问题

    微软在.NET4.5中升级了C#语言到5.0,加入了await和async语法,极大地方便了广大开发人员的异步编程,也是为了和WinRT API配套,因为这套API充满了异步编程. 在开发过程中发现有 ...

  2. [LeetCode 题解]: plusOne

    前言   [LeetCode 题解]系列传送门:  http://www.cnblogs.com/double-win/category/573499.html   1.题目描述 Given a no ...

  3. 直接导入用户信息到discuz ucenter.

    上一篇帖子: 直接导入帖子到Discuz 论坛数据库. 结束时说要写一篇导入用户的帖子, 一直没时间, 但是咱不能做太监,不是? 所以今天赶快补上. 在做discuz整合或者迁移是, 很多人可能遇到相 ...

  4. 操作Word的辅助类(word2003)

    该类在他人编写的几个类基础上扩展完善而来,主要功能有: (1)插入文本 (2)插入图片 (3)插入表格 (4)载入模版 (5)编辑模版,利用标签等 (6)插入页眉页脚 /*************** ...

  5. .net core 2.0 mvc 获取配置信息

    mvc_core_config *:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: 0 ...

  6. C# WPF 开发随想

    最近项目遇到切换窗口的时候偶尔出现闪屏的问题,前前后后花了两天的时间还是没有找到问题所在,一部分一部分的注释代码,看逻辑,开布局,还是一无所获. 最后还是他人的提醒下,直接不切换窗口,在同一个窗口中布 ...

  7. 【bzoj4889】: [Tjoi2017]不勤劳的图书管理员 分块-BIT

    [bzoj4889]: [Tjoi2017]不勤劳的图书管理员 题目大意:给定一个序列(n<=50000),每个数有一个编码ai(ai<=50000)和权值vi(vi<=100000 ...

  8. [译文]casperjs的API-colorizer模块

    colorizer模块包含了一个Colorizer类,它能够生成一个标准化的颜色字符串: var colorizer = require('colorizer').create('Colorizer' ...

  9. Linux Python import jenkins 报错 oserror: /usr/lib/python2.7/site-packages/lookup3.so

    安装了jenkins和Python-jenkins后,在脚本中import jenkins会报错:oserror: /usr/lib/python2.7/site-packages/lookup3.s ...

  10. 高阶篇:4.1.1)QFDI(客户需求转换为设计要求)

    本章目的:明确QFDI的作用:收集客户需求(Customer Needs),转换为设计要求(Design Feature).并介绍其制作方法. 1.QFDI质量屋举例 不用怀疑,现在大部分参考教材所谓 ...