• shell语法(一)


    概论

    shell是我们通过命令行与操作系统沟通的语言。
    shell脚本可以直接在命令行中执行,也可以将一套逻辑组织成一个文件,方便复用。

    Linux中常见的shell脚本有很多种,常见的有:

    • Bourne Shell(/usr/bin/sh或/bin/sh)
    • Bourne Again Shell(/bin/bash)
    • C Shell(/usr/bin/csh)
    • K Shell(/usr/bin/ksh)
    • zsh

    Linux系统中一般默认使用bash,所以接下来讲解bash中的语法。
    文件开头需要写#! /bin/bash,指明bash为脚本解释器。


    脚本示例

    新建一个test.sh文件,内容如下:

    #! /bin/bash
    echo "Hello World!"
    
    • 1
    • 2

    运行方式

    作为可执行文件

    chmod +x test.sh  # 使脚本具有可执行权限
    
    ./test.sh  # 当前路径下执行
    Hello World!  # 脚本输出
    
    /home/acs/test.sh  # 绝对路径下执行
    Hello World!  # 脚本输出
    
    ~/test.sh  # 家目录路径下执行
    Hello World!  # 脚本输出
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    用解释器执行

    bash test.sh
    Hello World!  # 脚本输出
    
    • 1
    • 2

    注释

    单行注释

    每行中#之后的内容均是注释。

    # 这是一行注释
    
    echo 'Hello World'  #  这也是注释
    
    • 1
    • 2
    • 3

    多行注释

    格式:

    :<<EOF
    第一行注释
    第二行注释
    第三行注释
    EOF
    
    • 1
    • 2
    • 3
    • 4
    • 5

    其中EOF可以换成其它任意字符串。例如:

    :<<abc
    第一行注释
    第二行注释
    第三行注释
    abc
    
    :<<!
    第一行注释
    第二行注释
    第三行注释
    !
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    变量

    定义变量

    定义变量,不需要加$符号,例如:

    name1='zyh'  # 单引号定义字符串
    name2="zyh"  # 双引号定义字符串
    name3=zyh    # 也可以不加引号,同样表示字符串
    
    • 1
    • 2
    • 3

    使用变量

    使用变量,需要加上$符号,或者${}符号。花括号是可选的,主要为了帮助解释器识别变量边界。

    name=zyh
    echo $name  # 输出zyh
    echo ${name}  # 输出zyh
    echo ${name}fighting  # 输出zyhfighting
    
    • 1
    • 2
    • 3
    • 4

    只读变量
    使用readonly或者declare可以将变量变为只读。

    name=zyh
    readonly name
    declare -r name  # 两种写法均可
    
    name=abc  # 会报错,因为此时name只读
    
    • 1
    • 2
    • 3
    • 4
    • 5

    删除变量

    unset可以删除变量。

    name=zyh
    unset name
    echo $name  # 输出空行
    
    • 1
    • 2
    • 3

    变量类型

    • 自定义变量(局部变量)
      子进程不能访问的变量
    • 环境变量(全局变量)
      子进程可以访问的变量

    自定义变量改成环境变量:

    name=zyh  # 定义变量
    export name  # 第一种方法
    declare -x name  # 第二种方法
    
    • 1
    • 2
    • 3

    环境变量改为自定义变量:

    export name=zyh  # 定义环境变量
    declare +x name  # 改为自定义变量
    
    • 1
    • 2

    字符串

    字符串可以用单引号,也可以用双引号,也可以不用引号。

    单引号与双引号的区别:

    单引号中的内容会原样输出,不会执行、不会取变量;
    双引号中的内容可以执行、可以取变量;

    name=zyh  # 不用引号
    echo 'hello, $name \"hh\"'  # 单引号字符串,输出 hello, $name \"hh\"
    echo "hello, $name \"hh\""  # 双引号字符串,输出 hello, zyh "hh"
    
    • 1
    • 2
    • 3

    获取字符串长度

    name="zyh"
    echo ${#name}  # 输出3
    
    • 1
    • 2

    提取字串

    name="hello, zyh"
    echo ${name:0:5}  # 提取从0开始的5个字符
    
    • 1
    • 2

    默认变量

    文件参数变量

    在执行shell脚本时,可以向脚本传递参数。$1是第一个参数,$2是第二个参数,以此类推。特殊的,$0是文件名(包含路径)。例如:

    创建文件test.sh

    #! /bin/bash
    
    echo "文件名:"$0
    echo "第一个参数:"$1
    echo "第二个参数:"$2
    echo "第三个参数:"$3
    echo "第四个参数:"$4
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    然后在命令行执行该脚本:

    chmod +x test.sh 
    ./test.sh 1 2 3 4
    #输出:
    文件名:./test.sh
    第一个参数:1
    第二个参数:2
    第三个参数:3
    第四个参数:4
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    其它参数相关变量

    参数说明
    $#代表文件传入的参数个数,如上例中值为4
    $*由所有参数构成的用空格隔开的字符串,如上例中值为"$1 $2 $3 $4"
    $@每个参数分别用双引号括起来的字符串,如上例中值为"$1" "$2" "$3" "$4"
    $$脚本当前运行的进程ID
    $? 上一条命令的退出状态(注意不是stdout,而是exit code)。0表示正常退出,其他值表示错误
    $(command)返回command这条命令的stdout(可嵌套)
    command返回command这条命令的stdout(不可嵌套)

    数组

    数组中可以存放多个不同类型的值,只支持一维数组,初始化时不需要指明数组大小。
    数组下标从 0 开始。

    定义

    数组用小括号表示,元素之间用空格隔开。例如:

    array=(1 abc "def" zyh)
    
    • 1

    也可以直接定义数组中某个元素的值:

    array[0]=1
    array[1]=abc
    array[2]="def"
    array[3]=zyh
    
    • 1
    • 2
    • 3
    • 4

    读取数组中某个元素的值

    格式:

    ${array[index]}
    
    • 1

    例如:

    array=(1 abc "def" zyh)
    echo ${array[0]}
    echo ${array[1]}
    echo ${array[2]}
    echo ${array[3]}
    
    • 1
    • 2
    • 3
    • 4
    • 5

    读取整个数组

    格式:

    ${array[@]}  # 第一种写法
    ${array[*]}  # 第二种写法
    
    • 1
    • 2

    例如:

    array=(1 abc "def" zyh)
    
    echo ${array[@]}  # 第一种写法
    echo ${array[*]}  # 第二种写法
    
    • 1
    • 2
    • 3
    • 4

    数组长度

    类似于字符串

    ${#array[@]}  # 第一种写法
    ${#array[*]}  # 第二种写法
    
    • 1
    • 2

    例如:

    array=(1 abc "def" zyh)
    
    echo ${#array[@]}  # 第一种写法
    echo ${#array[*]}  # 第二种写法
    
    • 1
    • 2
    • 3
    • 4
  • 相关阅读:
    金秋云创季——ECS爆品省钱攻略
    小黑子—MyBatis:第三章
    Cannot resolve dependency to assembly Microsoft Windows.Design.Extensibility
    el-table 翻页记住上页选项,包含回显选中的数据
    使用 Python 和CE进行游戏修改
    ocpp-远程启动(RemoteStartTransaction)、远程停止(RemoteStopTransaction)
    冠达管理:打新股的风险有多大?
    5UCMS采集发布插件-5UCMS免费采集发布插件
    Qt DoubleSlider双滑块支持float变化的控件,以及单滑块float控件
    SpringBoot集成支付宝 - 少走弯路就看这篇
  • 原文地址:https://blog.csdn.net/ndzyh/article/details/133299812