0%

【Linux】shell编程

Linux中利用shell来实现编程效果


1 Shell

1.1 介绍

  • Shell 是一个命令行解释器,它为用户提供了一个向Linux内核发送请求以便运行程序的界面系统级程序,用户可以用Shell来启动、挂起、停止甚至是编写一些程序

1.2 快速入门

  • (1)创建“hello.sh”文件
    1
    vim hello.sh
  • (2)输入脚本解析器以及脚本执行内容
    1
    2
    #!/bin/bash #脚本解析器为bash
    echo "hello, world!" #脚本执行内容
  • (3)给此脚本赋予执行权限“x”
    1
    chmod 744 hello.sh
  • (4)运行脚本
    1
    ./hello.sh

2 Shell变量

2.1 介绍

  • Shell中变量分为:系统变量用户自定义变量
  • 系统变量:$HOME,$PWD,$SHELL,$USER
  • set指令可查看所有系统变量
  • 自定义变量:变量=值
  • 撤销变量:unset 变量
  • 声明静态变量:readonly 变量(不能够unset)

2.2 定义规则

  • (1)变量名可以有字母,数字,下划线组成,但不能以数字开头
  • (2)等号两侧不能有空格
  • (3)变量名一般使用大写

2.3 命令返回值用于赋值

1
2
3
变量=`命令`

变量=$(命令)

2.4 演示


3 设置环境变量

3.1 介绍

  • linux上所有的环境变量都配置在/etc/profile中
  • export 变量=值来配置环境变量
  • 配置完毕后,通过source /etc/profile,重新加载配置文件来使用

3.2 演示

  • (1)打开/etc/profile配置环境变量
  • (2)echo打印一下环境变量(先要resource加载配置文件)

4 位置参数变量

4.1 介绍

  • 在我们执行shell脚本的时候,可以在后面拼接参数,进行传参,例:./test.sh hello world
  • shell脚本有对应的参数变量来接收这些参数
  • (1)$n (n为数字)
  • 以空格来切分命令,将上面命令变成[./test.sh, hello, world],通过$0, $1, $2来获取参数
  • 如果个数达到10位数以上,需要用大括号括住数字${10}
  • (2)$*
  • 获取全部参数,会将传入的参数hello world视为一个整体
  • (3)$@
  • 获取全部参数,与上面不同,会将helloworld区分为个体
  • (4)$#
  • 统计传入参数的个数

4.2 演示

  • (1)创建test.sh
  • (2)带参运行test.sh

5 预定义变量

5.1 介绍

  • shell本身有定义好的变量提供用户使用
  • (1)$$
  • 获取当前进行的PID
  • (2)$!
  • 获取后台运行的最后一个进程的进程号
  • (3)$?
  • 最后一次执行的命令的返回状态{0=正常,非0=异常}

5.2 演示

  • (1)创建test.sh文件
  • (2)运行test.sh文件

6 运算符

6.1 使用方式

1
2
3
4
5
6
7
(1)$((运算表达式))

(2)$[运算表达式]

(3)expr 运算表达式
# 注意:expr的算法表达式的运算符号间有空格
# 注意:用expr时乘法*需要用转译字符,即\*表示

6.2 演示


7 条件判断

7.1 判断条件

  • (1)比较符
    1
    2
    3
    4
    5
    6
    7
    = 字符串比较使用的等于

    -lt 小于
    -gt 大于
    -eq 等于
    -le 小于等于
    -ge 大于等于
  • (2)文件权限判断
    1
    2
    3
    -r 文件路径 :是否有读的权限
    -w 文件路径 :是否有写的权限
    -x 文件路径 :是否有执行的权限
  • (3)文件类型判断
    1
    2
    3
    -e 文件路径 :文件是否存在
    -f 文件路径 :文件是否是常规文件
    -d 文件路径 :文件是否是目录

7.2 if判断语法

  • 方式一
    1
    2
    3
    4
    5
    6
    7
    if [ 判断条件 ];
    then
    代码逻辑
    else
    代码逻辑
    fi
    # 注意:[]中的内容左右两边要有空格,[]结尾用带有;
  • (2)方式二
    1
    2
    3
    4
    5
    6
    7
    8
    # 方式二
    if [ 判断条件 ]
    then
    代码逻辑
    else
    代码逻辑
    fi
    # 注意:跟上面基本一致,少了个分号';'
  • (3)多重判断写法
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    # 多重判断写法
    if [ 判断条件 ]
    then
    代码逻辑
    elif [ 判断条件 ]
    then
    代码逻辑
    else
    代码逻辑
    fi
    # 注意:就是用elif来拼接,用上面两种写法都可以

7.3 演示


8 分支控制

8.1 case分支控制语法

  • case写法
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    case 变量 in
    "变量值1")
    逻辑代码1
    ;;
    "变量值2")
    逻辑代码2
    ;;
    ...
    *)
    默认逻辑
    ;;
    esac

8.2 演示


9 循环遍历

9.1 for循环语法

  • (1)方式一
    1
    2
    3
    4
    5
    for 暂时变量 in 变量1 变量2 变量3 ...
    do
    代码逻辑
    done
    # 注意:遍历时将变量1,2,3...分别赋值给暂时变量
  • (2)方式二
    1
    2
    3
    4
    5
    for ((初始值; 循环控制条件; 变量变化))
    do
    代码逻辑
    done
    # 注意:跟java语法遍历类似,只是用了两个()进行括起

9.2 for循环演示

9.3 while循环语法

  • while语法
    1
    2
    3
    4
    while [ 条件判断 ]
    do
    代码逻辑
    done

9.4 while循环演示


10 读取控制台输入

  • 类似java中的scanf,等待用户输入数据,然后才进行下一步操作

10.1 语法

1
2
3
4
5
read (选项) (参数) 接收变量

选项:
-p : 读取值时的提示符
-t : 读取值时的等待时间,超过等待时间,则自动往下执行

10.2 演示


11 函数

11.1 系统函数

  • (1)获取文件名
    1
    2
    basename (文件路径) (后缀名)
    # basename会自动帮助过滤路径,只保留文件名,若连后缀名也不保留,则要填写后缀名
  • (2)获取文件目录路径
    1
    2
    dirname (文件路径)
    # dirname与basename相反,反而会获取文件所在目录的路径

11.2 自定义函数

  • 函数自定义语法
    1
    2
    3
    4
    function (函数名) () {
    代码逻辑
    }
    # 注意:shell编程的函数不需要带形参