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. java 异步调用与多线程

    异步与多线程的区别 一.异步和多线程有什么区别?其实,异步是目的,而多 线程是实现这个目的的方法.异步是说,A发起一个操作后(一般都是比较耗时的操作,如果不耗时的操作 就没有必要异步了),可以继续自顾 ...

  2. css 三彩loading

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8" /> <title&g ...

  3. Javascript:splice() 方法浅析

    定义和用法: splice()方法用于插入.删除或替换数组的元素. 注:该方法会改变原始数组,splice() 方法与 slice() 方法的作用是不同的,splice() 方法会直接对数组进行修改 ...

  4. 201621123023《Java程序设计》第4周学习总结

    一.本周学习总结 1.1 写出你认为本周学习中比较重要的知识点关键词 继承.多态.覆盖.重载 1.2 尝试使用思维导图将这些关键词组织起来.注:思维导图一般不需要出现过多的字. 二.书面作业 1. 面 ...

  5. 30.Rotate Image(矩阵旋转)

    Level:   Medium 题目描述: You are given an n x n 2D matrix representing an image. Rotate the image by 90 ...

  6. js项目

    https://bbs.csdn.net/topics/320029234 文本实现悬挂缩进 牛逼牛逼 这是真的牛逼 p:first-letter {         margin-left: -2e ...

  7. Laravel 集成 JPush 极光推送指北

    我是一个 Laravel 小白,我是一个 Laravel 小白,我是一个 Laravel 小白(默念三遍再往下读,如果非小白就不用看了). Laravel 使用 Composer 来管理代码依赖.所以 ...

  8. 函数新特性、内联函数、const详解

    一.函数回顾与后置返回类型 函数定义中,形参如果在函数体内用不到的话,则可以不给形参变量名字,只给其类型. 函数声明时,可以只有形参类型,没有形参名 把函数返回类型放到函数名字之前,这种写法,叫前置返 ...

  9. 51 Nod 1067 博弈 SG函数

    1067 Bash游戏 V2 1 秒 131,072 KB 10 分 2 级题   有一堆石子共有N个.A B两个人轮流拿,A先拿.每次只能拿1,3,4颗,拿到最后1颗石子的人获胜.假设A B都非常聪 ...

  10. 分享自建的 Jrebel License Server 激活 Jrebel

    使用在线验证服务器激活 Jrebel 与 Idea 说明 代码来自于开源项目: gsls200808 / JrebelLicenseServerforJava 自建的服务地址 http://jrebe ...