• Shell脚本编程基础之shell脚本位置变量


    位置变量

    在bash shall中内置的变量,在脚本代码中调用通过命令行传递给脚本的参数

    听起来就像是交互式时候用的

    常见位置变量

    • $n $1,$2,$3……$n之类的,对应第一个、第二个参数 ##进行自动赋值

    • $0 指命令本身,并且包括路径

    • $* 传递给脚本的所有参数,所有参数合并为一个字符串

    • $@ 传递给脚本的所有参数,每个参数表现为一个独立的字符串

    • $# 传递给脚本参数的个数

    • 清空所有位置变量

    set -- 
    

    $*和$@

    $* 现实的是单个参数合起来

    [20:34:04 root@C8-3-55 ~]#vim f1.sh
    [20:36:00 root@C8-3-55 ~]#vim f2.sh
    [20:37:04 root@C8-3-55 ~]#chmod +x f1.sh f2.sh
    [20:37:31 root@C8-3-55 ~]#cat f1.sh f2.sh
    #!/bin/bash
    echo All args are "$*"
    f2.sh "$*"
    #!/bin/bash
    echo 1st arg is $1
    [20:39:50 root@C8-3-55 ~]#cp f1.sh /usr/local/bin;cp f2.sh /usr/local/bin
    cp:是否覆盖'/usr/local/bin/f1.sh'? y
    [20:40:19 root@C8-3-55 ~]#f1.sh a b c
    All args are a b c
    1st arg is a b c  ## 嵌套执行f2.sh 显示$1的时候,将f1后面的参数作为一个整体
    [20:40:31 root@C8-3-55 ~]#f2.sh a b c
    1st arg is a
    

    将$* 改为$@后,则仍旧单个显示参数

    [20:55:53 root@C8-3-55 ~]#cat f3.sh
    #!/bin/bash
    echo 1st arg is "$1"
    echo 2st arg is "$2"
    echo 3st arg is "$3"
    echo All args arg "$*"
    echo All args are "$@"
    f2.sh "$@"
    
    [20:59:18 root@C8-3-55 ~]#./f3.sh d e f
    1st arg is d
    2st arg is e
    3st arg is f
    All args arg d e f
    All args are d e f
    1st arg is d
    

    $0可以显示脚本名

    • $0显示脚本名,可以利用软链接创建多个不同的名字。

    • 根据不同的名字进行条件判断,让同一脚本实现不同功能

    实例

    • 显示位置变量的用法
      1 #!/bin/bash
      2 #
      3 echo 1st arg is $1
      4 echo 2st arg is $2
      5 echo 3st arg is $3
      6
      7 echo args all are $*
      8 echo args all are $@
      9
     10 echo arg number is $#
     11
     12 echo the scripatname is $(`basename` $0)
    
    [01:30:51 root@C8-3-55 ~]#bash -x arg.sh William Henry Gates III
    + echo 1st arg is William
    1st arg is William
    + echo 2st arg is Henry
    2st arg is Henry
    + echo 3st arg is Gates
    3st arg is Gates
    + echo args all are William Henry Gates III
    args all are William Henry Gates III
    + echo args all are William Henry Gates III
    args all are William Henry Gates III
    + echo arg number is 4
    arg number is 4
    + echo the scripatname is basename arg.sh
    the scripatname is basename arg.sh
    
    • 运用位置便令编写备份脚本
    [02:08:35 root@C8-3-55 ~]#cat backup_V1.0.sh
    #!/bin/bash
    #
    SRC=$1
    DEST=/backup${SRC}_`date +%F_%H-%M-$S`
    tar -czvf $DEST.tar.gz $SRC
    [02:08:46 root@C8-3-55 ~]#bash backup_V1.0.sh /data
    tar: 从成员名中删除开头的“/”
    /data/
    /data/data1.log
    
    [02:09:53 root@C8-3-55 ~]#ll /backup/
    总用量 0
    [02:09:59 root@C8-3-55 ~]#bash backup_V1.0.sh /data
    tar: 从成员名中删除开头的“/”
    /data/
    /data/data1.log
    [02:10:06 root@C8-3-55 ~]#ll /backup/
    总用量 4
    -rw-r--r--. 1 root root 224 3月  11 02:10 data_2021-03-11_02-10-.tar.gz
    
    • 使用位置变量实现mv替代rm命令的脚本

    用mv代替rm可以防止误删除

    
    [02:34:39 root@C8-3-55 ~]#echo $PATH
    /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
    [02:35:55 root@C8-3-55 ~]#ln rm.sh /usr/bin/rmtomv.sh  ##在环境变量目录中做硬链接
    [02:40:41 root@C8-3-55 ~]#alias rm='/usr/bin/rmtomv.sh' ##对rm进行别名
    [02:41:05 root@C8-3-55 ~]#type rm
    rm 是 `/usr/bin/rmtomv.sh' 的别名 ##查看rm现状
    [02:43:44 root@C8-3-55 ~]#cat rm.sh
    #!/bin/bash
    #
    WARING_COLOR="echo -e E[1:31m"
    END="E[0m"
    DIR=/tmp/RECYCLER_`date +%F_%H-%M-%S` ##定义回收站目录
    mkdir $DIR
    mv $* $DIR
    ${WARING_COLOR}Already Moved $* to $DIR !!! $END
    
    
    [02:45:47 root@C8-3-55 ~]#mkdir /data ; touch /data/{a..b}{1..3}.log;ll /data
    总用量 0
    -rw-r--r--. 1 root root 0 3月  11 02:46 a1.log
    -rw-r--r--. 1 root root 0 3月  11 02:46 a2.log
    -rw-r--r--. 1 root root 0 3月  11 02:46 a3.log
    -rw-r--r--. 1 root root 0 3月  11 02:46 b1.log
    -rw-r--r--. 1 root root 0 3月  11 02:46 b2.log
    -rw-r--r--. 1 root root 0 3月  11 02:46 b3.log
    [02:46:58 root@C8-3-55 ~]#type rm ##再次确认命令状态
    rm 是 `/usr/bin/rmtomv.sh' 的别名
    [02:47:09 root@C8-3-55 ~]#rm /data/*
    Already Moved /data/a1.log /data/a2.log /data/a3.log /data/b1.log /data/b2.log /data/b3.log to /tmp/RECYCLER_2021-03-11_02-47-27 !!!
    [02:47:27 root@C8-3-55 ~]#ll /tmp/RECYCLER_2021-03-11_02-47-27 ##查看回收站
    总用量 0
    -rw-r--r--. 1 root root 0 3月  11 02:46 a1.log
    -rw-r--r--. 1 root root 0 3月  11 02:46 a2.log
    -rw-r--r--. 1 root root 0 3月  11 02:46 a3.log
    -rw-r--r--. 1 root root 0 3月  11 02:46 b1.log
    -rw-r--r--. 1 root root 0 3月  11 02:46 b2.log
    -rw-r--r--. 1 root root 0 3月  11 02:46 b3.log
    

    ln硬链接命令方便版本更新,更新程序后只要重做硬链接即可,系统中别名命令不变

    * * * 胖并快乐着的死肥宅 * * *
  • 相关阅读:
    Python学习笔记 for windows 二
    Socket.io:有点意思
    MEAN Stack:创建RESTful web service
    在EC2上安装MEAN环境
    NodeJS:树的序列化
    NodeJS:树的反序列化
    NodeJS学习:爬虫小探补完计划
    NodeJS学习:爬虫小探
    依赖包bcrypt安装Issues
    Mongoose:Schema之路
  • 原文地址:https://www.cnblogs.com/bpzblog/p/14517019.html
Copyright © 2020-2023  润新知