• SHELL (3) —— 变量知识进阶和实践


    摘自:Oldboy Linux运维——SHELL编程实战

    SHELL中特殊切重要的变量

    位置变量 作用说明
    $0 获取当前执行的Shell脚本的文件名,如果执行脚本包含了路径,那么就包括脚本路径
    $n

    获取当前执行的Shell脚本的第n个参数值,n=1..9,当n为0时表示脚本的文件名;

    如果n大于9,则用大括号括起来,例如${10},接的参数以空格隔开

    $# 获取当前执行的Shell脚本后面接的参数的总个数
    $*

    获取当前Shell脚本所有传参的参数,不加引号和$@相同;

    如果给$*加上双引号,例如:"$*",则表示将所有的参数视为单个字符串,相当于"$1 $2 $3"

    $@

    获取当前Shell脚本所有传参的参数,不加引号和$*相同;

    如果给$@加上双引号,例如:"$@",则表示将所有的参数视为不同的独立字符串,相当于"$1" "$2" "$3" "..."。

    这是将多参数传递给其他程序的最佳方式,因为它会保留所有的内嵌在每个参数里的任何空白。

    当"$@"和"$*"都加双引号时,两者是有区别的;都不加双引号时,两者无区别

    dirname命令的作用是获取脚本的路径。

    bashname命令的作用是获取脚本的名字。

    [root@yeebian ~]# vim /tmp/variable.sh
    #!/bin/bash
    dirname $0
    basename $0
    [root@yeebian ~]# bash /tmp/variable.sh 
    /tmp
    variable.sh
    

    $#特殊变量获取脚本传参个数的实

    [root@yeebian tmp]# vim variable.sh 
    #!/bin/bash
    #表达式方式
    [ $# -ne 2 ]&&{
       echo "Must two args."
       exit 1
    }
    echo oldgirl
    [root@yeebian tmp]# bash variable.sh 12
    Must two args.
    [root@yeebian tmp]# bash variable.sh 12 8
    oldgirl
    
    [root@yeebian tmp]# vim variable.sh 
    #!/bin/bash
    #if判断语句方式
    if [ $# -ne 2 ]
    then
       echo "USAGE:/bin/sh $0 arg1 arg2"
       exit 1
    fi
    echo $1 $2
    [root@yeebian tmp]# bash variable.sh good
    USAGE:/bin/sh variable.sh arg1 arg2
    [root@yeebian tmp]# bash variable.sh good bad
    good bad
    

    SHELL进程中的特殊状态变量

    位置变量 作用说明
    $? 获取执行上一个指令的执行状态返回值(0为成功,非零为失败),可根据返回值来判断软件的安装步骤是否成功
    $$ 获取当前执行的Shell脚本的进程号(PID)
    $! 获取上一个在后台工作的进程的进程号(PID)
    $_ 获取在此之前执行的命令或脚本的最后一个参数

    在企业场景下,“$?”返回值的用饭如下:

    1)判断命令、脚本或函数等程序是否执行成功。

    2)若在脚本中调用执行“exit数字”,则会返回这个数字给“$?”变量。

    3)如果是在函数里,则通过“return数字”把这个数字以函数返回值的形式传给“$?”

    Shell变量子串说明

    表达式 说明
    ${parameter} 返回变量$parameter的内容
    ${#parameter} 返回变量$parameter内容的长度(按字符),也适用于特殊变量
    ${parameter:offset} 在变量${parameter}中,从位置offset之后开始提取子串到结尾
    ${parameter:offset:length} 在变量${parameter}中,从位置offset之后开始提取长度为length的子串
    ${parameter#word} 从变量${parameter}开头开始删除最短匹配的word子串
    ${parameter##word} 从变量${parameter}开头开始删除最长匹配的word子串
    ${parameter%word} 从变量${parameter}结尾开始删除最短匹配的word子串
    ${parameter%%word} 从变量${parameter}结尾开始删除最长匹配的word子串
    ${parameter/patern/string} 使用string代替第一个匹配的pattern
    ${parameter//pattern/string} 使用string代替所有匹配的pattern
    [root@yeebian ~]# cat parameter.sh 
    #!/bin/bash
    #1.定义TEST变量,截取其内容,从第二个字符之后开始截取,默认截取后面字符的全部,第二个字符不包含在内,也可理解为删除前面的多个字符。
    TEST="It is a test"
    echo $TEST
    echo "1.${TEST:2}"
    
    #2.截取TEST变量内容,从第二个字符之后开始截取,截取两个字符。
    echo -e "2.${TEST:2:2}
    "
    
    #3.从变量$TEST内容的开头开始删除最短匹配"a*C"及"a*c"的子串。
    TEST=abcABC123ABCabc
    echo $TEST
    echo "3.${TEST#a*C}"
    echo -e "  ${TEST#a*c}
    "
    
    #4.从变量$TEST开头开始删除最长匹配"a*C"及“a*c”的子串。
    echo "4.${TEST##a*C}"
    echo -e "  ${TEST##a*c}
    "
    #5.从变量$TEST结尾开始删除最短匹配"a*C"及"a*c"的子串。
    echo "5.${TEST%a*C}"
    echo -e "  ${TEST%a*c}
    "
    #6.从变量$TEST结尾开始删除最长匹配"a*C"及"a*c"的子串。
    echo "6.${TEST%%a*C}"
    echo -e "  ${TEST%%a*c}
    "
    #7.使用testing字符串代替变量$TEST匹配的test字符串。
    TEST="It is a test."
    echo $TEST
    echo "7.${TEST//test/testing}"   #其中一个“/”表示替换匹配的第一个字符串;两个“/”表示替换匹配的所有字符串。
    [root@yeebian ~]# bash parameter.sh 
    It is a test
    1. is a test            #<==相当于从t开始计算,包含空格在内,一起截取到结尾 
    2. i                    #<==截取空格和i两个字符
    abcABC123ABCabc
    3.123ABCabc
      ABC123ABCabc
    4.abc
      
    5.abcABC123ABCabc
      abcABC123ABC
    6.abcABC123ABCabc
      
    It is a test.
    7.It is a testing.    
    

    去掉下面所有文件的文件名中的“_finished”字符串

    [root@yeebian ~]# ll *.jpg
    -rw-r--r--. 1 root root 0 May 29 01:11 stu_102999_1_finished.jpg
    -rw-r--r--. 1 root root 0 May 29 01:11 stu_102999_2_finished.jpg
    -rw-r--r--. 1 root root 0 May 29 01:11 stu_102999_3_finished.jpg
    -rw-r--r--. 1 root root 0 May 29 01:11 stu_102999_4_finished.jpg
    -rw-r--r--. 1 root root 0 May 29 01:11 stu_102999_5_finished.jpg
    [root@yeebian ~]# file=stu_102999_1_finished.jpg 
    [root@yeebian ~]# mv $file `echo ${file//_finished/}` 
    [root@yeebian ~]# ll *.jpg
    -rw-r--r--. 1 root root 0 May 29 01:11 stu_102999_1.jpg
    -rw-r--r--. 1 root root 0 May 29 01:11 stu_102999_2_finished.jpg
    -rw-r--r--. 1 root root 0 May 29 01:11 stu_102999_3_finished.jpg
    -rw-r--r--. 1 root root 0 May 29 01:11 stu_102999_4_finished.jpg
    -rw-r--r--. 1 root root 0 May 29 01:11 stu_102999_5_finished.jpg
    [root@yeebian ~]# for file in `ls *fin*.jpg`;do mv $file `echo ${file//_finished/}`;done       #for循环实现批量处理
    [root@yeebian ~]# ll *.jpg
    -rw-r--r--. 1 root root 0 May 29 01:11 stu_102999_1.jpg
    -rw-r--r--. 1 root root 0 May 29 01:11 stu_102999_2.jpg
    -rw-r--r--. 1 root root 0 May 29 01:11 stu_102999_3.jpg
    -rw-r--r--. 1 root root 0 May 29 01:11 stu_102999_4.jpg
    -rw-r--r--. 1 root root 0 May 29 01:11 stu_102999_5.jpg
    

    Shell特殊扩展变量说明

    表达式 说明
    ${parameter:-word}

    如果parameter的变量值为空或未赋值,则会返回word字符串并替代变量的值

    用途:如果变量未定义,则返回备用的值,防止变量为空值或因未定义而导致异常

    ${parameter:==word}

    如果parameter的变量值为空或未赋值,则设置这个变量值为word,并返回其值。位置变量和特殊变量不适用

    用途:基本同上一个${parameter:-word},但该变量又额外给parameter变量赋值了

    ${parameter:?word}

    如果parameter变量值为空或未赋值,那么word字符串将被作为标准错误输出,否则输出变量的值。

    用途:用于捕捉由于变量未定义而导致的错误,并退出程序

    ${parameter:+word} 如果parameter变量值为空或未赋值,则什么都不做,否则word字符串将替代变量的值

    例子

    1.[root@yeebian ~]# echo $test
       
      [root@yeebian ~]# result=${test:-UNSET}
      [root@yeebian ~]# echo $result
      UNSET
    2.[root@yeebian ~]# echo $result
       
      [root@yeebian ~]# echo $test
    
      [root@yeebian ~]# result=${test:=UNSET}
      [root@yeebian ~]# echo $result
      UNSET
      [root@yeebian ~]# echo $test 
      UNSET
    3.[root@yeebian ~]# echo $test
    
      [root@yeebian ~]# echo ${test:?testing}
      -bash: test: testing
      [root@yeebian ~]# test=1
      [root@yeebian ~]# echo ${test:?testing}
      1
    4.[root@yeebian ~]# echo $test
    
      [root@yeebian ~]# result=${test:+testing}
      [root@yeebian ~]# echo $result
    
      [root@yeebian ~]# test=four
      [root@yeebian ~]# result=${test:+testing}
      [root@yeebian ~]# echo $result
      testing
    

    删除7天前过期数据备份

    [root@yeebian ~]# vim del.sh
    #!/bin/bash
    find ${path:-/tmp} -name "*.tar.gz" -type f -mtime +7 | xargs rm -f
    [root@yeebian ~]# bash -x del.sh 
    + find /tmp -name '*.tar.gz' -type f -mtime +7
    + xargs rm -f
    
  • 相关阅读:
    vuesocket.io在单文件中使用(进入到单文件再发请求)
    el-tree设置默认展开及选中
    Vue项目中解决跨域问题
    echarts堆叠条形图计算总数()
    原生js实现点击目标区域外侧触发事件
    js构造树形菜单
    wangEditor服务器上传图片(Vue使用)
    webpack(6) 打包多页应用和sourcemap 使用
    NoSql相关
    Markdown
  • 原文地址:https://www.cnblogs.com/vurtne-lu/p/6993742.html
Copyright © 2020-2023  润新知