一、判断语句

if…then形式
类似于C/C++中的if-else语句。

1、单层if
命令格式:
if condition
then
    语句1
    语句2
    ...
fi

2、单层if-else
命令格式
if condition
then
    语句1
    语句2
    ...
else
    语句1
    语句2
    ...
fi

3、多层if-elif-elif-else
命令格式
if condition
then
    语句1
    语句2
    ...
elif condition
then
    语句1
    语句2
    ...
elif condition
then
    语句1
    语句2
else
    语句1
    语句2
    ...
fi

4、case…esac形式
类似于C/C++中的switch语句。
命令格式
case $变量名称 in
    值1)
        语句1
        语句2
        ...
        ;;  # 类似于C/C++中的break
    值2)
        语句1
        语句2
        ...
        ;;
    *)  # 类似于C/C++中的default
        语句1
        语句2
        ...
        ;;
esac

在shell脚本中,使用-eq、-ne、-gt、-ge、-lt、-le进行整数的比较。英文意思分别为:

-eq :equal(相等)

-ne :not equal(不等)

-gt :greater than(大于)

-ge :greater than or equal(大于或等于)

-lt :less than(小于)

-le :less than or equal(小于或等于)

注意:在shell中这些符号只能用于整数的比较,不能用于字符串。

二、循环语句

1、for…in…do…done

命令格式:
for var in val1 val2 val3
do
    语句1
    语句2
    ...
done

示例1,输出a 2 cc,每个元素一行:
for i in a 2 cc
do
    echo $i
done

2、for ((…;…;…)) do…done

命令格式:
for ((expression; condition; expression))
do
    语句1
    语句2
done

示例,输出1-10,每个数占一行:

for ((i=1; i<=10; i++))
do
    echo $i
done

3、while…do…done循环

命令格式:
while condition
do
    语句1
    语句2
    ...
done

示例,文件结束符为Ctrl+d,输入文件结束符后read指令返回false。
while read name
do
    echo $name
done

4、until…do…done循环

当条件为真时结束。

命令格式:

until condition
do
    语句1
    语句2
    ...
done

示例,当用户输入yes或者YES时结束,否则一直等待读入。
until [ "${word}" == "yes" ] || [ "${word}" == "YES" ]
do
    read -p "Please input yes/YES to stop this program: " word
done

5、break命令
跳出当前一层循环,注意与C/C++不同的是:break不能跳出case语句。

示例
while read name
do
    for ((i=1;i<=10;i++))
    do
        case $i in
            8)
                break
                ;;
            *)
                echo $i
                ;;
        esac
    done
done

该示例每读入非EOF的字符串,会输出一遍1-7。
该程序可以输入Ctrl+d文件结束符来结束,也可以直接用Ctrl+c杀掉该进程。

6、continue命令
跳出当前循环。

示例:
for ((i=1;i<=10;i++))
do
    if [ `expr $i % 2` -eq 0 ]
    then
        continue
    fi
    echo $i
done
该程序输出1-10中的所有奇数。

死循环的处理方式

如果AC Terminal可以打开该程序,则输入Ctrl+c即可。

否则可以直接关闭进程:
(1)使用top命令找到进程的PID

(2)输入kill -9 PID即可关掉此进程

三、函数

bash中的函数类似于C/C++中的函数,但return的返回值与C/C++不同,返回的是exit code,取值为0-255,0表示正常结束。
如果想获取函数的输出结果,可以通过echo输出到stdout中,然后通过$(function_name)来获取stdout中的结果。
函数的return值可以通过$?来获取。
1、命令格式:
[function] func_name() {  # function关键字可以省略
    语句1
    语句2
    ...
}

(1)不获取 return值和stdout值
示例

func() {
    name=yxc
    echo "Hello $name"
}

func

输出结果:
Hello yxc

(2)获取 return值和stdout值
不写return时,默认return 0。

示例

func() {
    name=yxc
    echo "Hello $name"

    return 123
}

output=$(func)
ret=$?

echo "output = $output"
echo "return = $ret"

输出结果:
output = Hello yxc
return = 123

2、函数的输入参数
在函数内,$1表示第一个输入参数,$2表示第二个输入参数,依此类推。
注意:函数内的$0仍然是文件名,而不是函数名。

示例:

func() {  # 递归计算 $1 + ($1 - 1) + ($1 - 2) + ... + 0
    word=""
    while [ "${word}" != 'y' ] && [ "${word}" != 'n' ]
    do
        read -p "要进入func($1)函数吗?请输入y/n:" word
    done

    if [ "$word" == 'n' ]
    then
        echo 0
        return 0
    fi  

    if [ $1 -le 0 ]
    then
        echo 0
        return 0
    fi  

    sum=$(func $(expr $1 - 1))
    echo $(expr $sum + $1)
}

echo $(func 10)

输出结果:
55

3、函数内的局部变量
可以在函数内定义局部变量,作用范围仅在当前函数内。
可以在递归函数中定义局部变量。

命令格式:
local 变量名=变量值

例如:
#! /bin/bash

func() {
    local name=yxc
    echo $name
}
func

echo $name

输出结果:
yxc
第一行为函数内的name变量,第二行为函数外调用name变量,会发现此时该变量不存在。

最新文章

  1. JavaScript基础学习-函数及作用域
  2. Linux 文件压缩与归档
  3. 比较有价值的参考文档-----------------URL
  4. 一份高级Java招聘要求
  5. Codeforces 650B Image Preview
  6. 越狱Season 1-Episode 15: By the Skin and the Teeth
  7. JSP的Servlet监听器
  8. Morris Traversal 二叉树遍历。
  9. 字符串编码---hash函数的应用
  10. 关于本地$.get(url,function(data)),异步获取数据
  11. Android 圆形背景shape定义
  12. android之View的启动过程
  13. ajax和jsonp使用总结
  14. 个人网站建设(适合Java初学者)(一)
  15. js 骂人不带脏字 (!(~+[]) + {})[--[~+&quot;&quot;][+[]] * [~+[]] + ~~!+[]] + ({} + [])[[~!+[]] * ~+[]] 图解
  16. 爬坑之路---Google map
  17. 修改docker image存放位置
  18. 用GDB调试程序(二)
  19. 【题解】亚瑟王 HNOI 2015 BZOJ 4008 概率 期望 动态规划
  20. Docker技术入门与实战 第二版-学习笔记-2-镜像构建

热门文章

  1. java画海报
  2. 2211-22学习记录之python百分数,time模块
  3. 如何通过C#/VB.NET代码在Word中更改字体颜色
  4. 学习Java Day23
  5. Mybatis的缓存与动态SQL
  6. 微信小程序分类菜单激活状态跟随列表滚动自动切换
  7. RocketMQ - 生产者最佳实践总结
  8. 跳板攻击之:EarthWorm代理转发
  9. Swiper第一页与最后一页禁止滑动
  10. 苹果iPhone 日历查询功能异常