• 一文快速学会linux shell 编程基础!!!



    前言

    shell脚本编程是linux中重要的一个环节,熟悉shell脚本编程,我们可以更好的在linux环境下工作。


    一、shell脚本执行的方式

    1.格式要求

    脚本要以#!/bin/bash 开头

    2.脚本常用执行方式

    2.1 . 输入脚本的绝对路径或相对路径进行执行

    这个没什么好说的,只说一点,这种执行方式需要有执行权限。

    2.2 使用 sh + 脚本的方式

    bash 脚本的路径
    这种方式不需要有执行权限就可以执行
    
    • 1
    • 2

    shell 的注释语法

    # 是shell的单行注释
    :<

    :< xxxx
    xxxxx
    !

    二、shell 变量

    1.shell变量介绍

    代码如下(示例):

    linux shell中的变量分为,系统变量和用户自定义变量
    系统变量:$HOME,$PWD,$SHELL,$USER等等
    显示当前shell中所有的变量:set

    2.shell 变量的定义

    定义变量

    1.定义变量:变量名=值
    2.撤销变量:unset 变量
    3.声明静态变量:readonly 变量名=值
    注意,静态变量不能使用unset

    下面的代码会在最后一行报错

    #!/bin/bash
    # 定义变量A
    A=100
    # 输出变量需要加上$
    echo A=$A
    echo "A=$A"
    # 撤销变量A
    unset A
    echo "A=$A"
    # 声明静态的变量B=2,不能unset
    readonly B=2
    echo "B=$B"
    unset B
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    定义变量的规则

    变量名称可以由字母、数字和下划线组成,但是不能以数字开头
    5A=100就是错的
    等号两侧不能有空格
    变量名称一般习惯为大写,这个是一个规范,遵守即可

    将命令的返回值赋给变量

    A=`date` 反引号,运行里面的命令,并把结果返回给变量A
    A=$(date) 等价于 A=`date`

    3.设置环境变量

    (关于这个,如果你之前在linux环境下配置过java的环境变量,这个可以不用看,步骤是一模一样的)
    基本流程

    1. export 变量名=变量值(一般都是在/etc/profile里面写环境变量)
    2. source 配置文件
    3. echo $变量名

    3.位置参数变量

    位置参数变量,用大白话来说,就是当你用命令行执行这个shell脚本文件的时候,来获取这行命令里面的一些东西

    基本语法

    • $n(n为数字,$0代表命令本身,$1~$9代表第一到第九个参数,如果要获取第十个以上的参数,需要这样写 ${10} )
    • $*(这个变量代表命令行中的所有参数,但是把所有的参数看成一个整体)
    • $@ (这个变量也是代表命令行中的所有参数,但是$@把每个参数区分对待)
    • $# (这个变量代表命令行中的所有参数的个数)

    下面有一个shell脚本可以供大家理解

    #!/etc/bash
    
    echo "0=$0 1=$1 2=$2"
    
    for i in "$*";do
     echo $i
    done
    
    for i in "$@";do
    echo $i
    done
    
    echo "number=$#"
    ~                   
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    在这里插入图片描述
    $ @ 与 $ * 如果不在双引号里面的效果是一样的,但是如果在双引号里面
    $ * 就会把所有的参数当作一个东西来看,这在上面的代码里面已经看的很清楚了,
    $ @ 则是分开的

    4.预定义变量

    大白话就是shell设计者已经定义好的变量,可以直接使用

    • $$ (获得当前进程的进程号(PID))
    • $! (后台运行的最后一个进程的进程号(PID))
    • $?(最后一次执行的命令的返回状态。如果这个变量的值为0,证明上一个命令正确执行;如果这个变量的值为非0,则证明上一个命令执行不正确了)
    #!/bin/bash
    echo "当前执行的进程id=$$"
    # 以后台的方式运行一个脚本,并获得他的进程号
    . position.sh 100 200 &
    echo "最后一个后台方式运行的进程id=$!"
    echo "执行结果是=$?"
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    在这里插入图片描述

    三、运算符

    基本语法

    • $((运算式)) 或 $[运算式] 或 expr m + n (expr代表 expression ,expr的写法中运算符之间要有空格)
    • 乘号 \*(对,就是这么奇怪,有反斜杠)
    • 除号 /
    • 取余 %
    • 如果希望将expr的运算结果赋给某个变量,可以使用我们之前学习的反引号(就是1左边的那个)``
    #!/bin/bash
    #案例1:计算(2+3)*4的值
    #使用第一种方式
    RES1=$(((2+3)*4))
    echo "res1=$RES1"
    #使用第二种方式
    RES2=$[(2+3)*4]
    echo "res2=$RES2"
    #使用第三种方式
    TMP=`expr 2 + 3`
    RES4=`expr $TMP \* 4`
    echo "temp=$TMP"
    echo "res4=$RES4"
                         
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    在这里插入图片描述

    四、条件判断

    判断语句
    基本语法

    • [ condition ] (注意!!!condition前后要有空格),非空返回true,可使用$?验证
      常用判断条件
    1. 字符串比较 =
      两个整数的比较
    • -lt 小于

    • -le 小于等于

    • -eq 等于

    • -gt 大于等于

    • -ne不等于
      按照文件权限进行判断

    • -r 有读的权限

    • -w 有写的权限

    • -x 有执行的权限
      按照文件类型进行判断

    • -f文件存在并且是一个常规的文件

    • -e 文件存在

    • -d 文件存在并且是一个目录


    照例来个代码

    #!/bin/bash
    #案例1:"ok"是否等于ok
    
    # 判断语句,使用 =
    if [ "ok" = "ok" ]
    then
            echo "equal"
    fi
    
    # 案例2:23是否大于等于22
    #判断语句:使用-ge
    if [ 23 -ge 22 ]
    then
            echo "大于"
    fi
    
    # 案例3:/shellcode/aaa.txt 目录中的文件是否存在
    # 判断语句:使用 -f
    if [ -f /shellcode/aaa.txt ]
    then
            echo "存在"
    fi
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    在这里插入图片描述

    五、流程控制

    1.if判断语句

    (这个我不再多说了,相信学linux的各位至少学过一门编程语言)
    基本语法
    单分支

    if [ 条件判断式 ]
    then
    代码
    fi

    或者 多分支

    if [ 条件判断式 ]
    then
    代码
    elif [条件判断式]
    then
    代码
    elif [条件判断式]
    then
    代码
    …(这里指可以写多个elif)
    else(else可省略)
    代码
    fi

    2.case判断语句

    (这个跟java 里面的 switch case 类似,但是看起来非常的诡异)
    基本语法

    case $变量名 in
    “值1”)(注:如果变量的值等于值1,则执行程序1)
    代码
    ;;
    “值2”)(注:如果变量的值等于值2,则执行程序2)
    代码
    ;;
    *)(注:如果变量的值都不是以上的值,则执行下面的代码)
    代码
    ;;
    esac

    #!/bin/bash
    case $1 in
    "1")
    echo "周一"
    ;;
    "2")
    echo "周二"
    ;;
    *)
    echo "other..."
    ;;
    esac
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    在这里插入图片描述

    3.for循环语句

    基本语法

    for 变量 in 值1 值2 值3
    do
    程序
    done

    或者

    for ((初始值;循环控制条件;变量变化))
    do
    程序
    done

    #!/bin/bash
    for i in "$*"
    do
     echo $i
    done
    
    for i in "$@"
    do
    echo $i
    done
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    #!/bin/bash
    SUM=0
    for ((i=0;i<=$1;i++))
    do
    SUM=$[$SUM+$i]
    done
    echo $SUM
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    在这里插入图片描述

    4.while循环语句

    while [条件判断式]
    do
    程序
    done

    #!/bin/bash
    SUM=0
    i=0
    while [ $i -le $1 ]
    do
            SUM=$[$SUM+$i]
            i=$[$i+1]
    done
    echo "执行结果=$SUM"
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    在这里插入图片描述

    六、read读取控制台输入

    基本语法

    read (选项) (参数)
    选项:
    -p :指定读取值时的提示符;
    -t ; 指定读取值时的等待的时间(秒),如果没有在指定的时间内输入,就不再等待了。。。
    参数:
    变量:指定读取值的变量名
    注意!!! read 与 $n 不同,read的读取输入是必须要输入的,如果你不输入,脚本> 会一直在那个地方堵塞

    #!/bin/bash
    #读取控制台输入一个NUM1值
    read -p "请输入一个数NUM1=" NUM1#这里要注意 NUM1 跟前面的双引号要有空格,下面的NUM2也是如此
    echo "你输入的NUM1=$NUM1"
    # 读取控制台输入一个NUM1值,在10秒内输入
    read -t 10 -p "请输入一个数NUM2=" NUM2
    echo "你输入的NUM2=$NUM2"
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    在这里插入图片描述

    七、函数

    • 函数介绍
      shell编程和其他编程语言一样,有系统函数,也可以自定义函数。系统函数中,我们这里就介绍两个。

    系统函数

    basename基本语法
    功能:返回完整路径最后 / 的部分,常用用于获取文件名

    basename [pathname] [suffix]
    (功能描述:basement命令会删除所有的前缀包括最后一个(“/”)字符,然后将字符串显示出来)
    suffix 为后缀,如果suffix 被指定了,basename 会将pathname 或 string 中的 suffix 去掉

    在这里插入图片描述

    dirname 基本语法
    功能:返回完整路径最后 / 的前面的部分,常用于返回路径部分
    语法
    dirname 文件绝对路径 (功能描述:从给定的包含绝对路径的文件名中去除文件名)

    在这里插入图片描述

    自定义函数

    基本语法

    [ function ] funname[()]
    {
    Action;
    [return int;]
    }

    调用直接写函数名:funname [值]

    #!/bin/bash
    function getSum() {
    
            read -p "请输入一个数n1=" n1
            read -p "请输入一个数n2=" n2
            SUM=$[$n1+$n2]
            echo "和是=$SUM"
    }
    
    getSum
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    在这里插入图片描述

  • 相关阅读:
    C++ IO流
    基于ES6的文章发布系统的设计与实现
    VMware虚拟机以及centos7入门安装教程
    Selenium实现原理
    傅里叶变换和其图像处理中的应用
    RocketMQ 发送顺序消息
    【云原生】k8s中volumeMounts.subPath的巧妙用法
    GCC编译
    【性能基石之IO~~~Linux操作系统相关知识体系补充&虚拟文件系统&文件描述符&PageCache内核缓存页】
    TCP协议详解
  • 原文地址:https://blog.csdn.net/wish_you_luck/article/details/127850014