zoukankan      html  css  js  c++  java
  • Shell编程之特殊变量(详解) Theletter

    $0 $# $n-->$[1..9] $* $@

    1、在shell中存在着一些特殊而又重要的变如:$1 $0 $#,我们称为特殊的位置变量要从命令行,函数,脚本,等传递参数时,就需要在shell脚本中使用位置参数变量
    $0:显示当前的脚本文件名,如果在执行脚本时添加了路径,那么全部都会输出
    $n:获取当前执行的shell脚本的第n个参数值比如:[n=1..9],如果N大于9那么就要使用{}来定义 比如${10}
    $#:获取当前shell脚本后面接的参数的个数
    $*:获取当前脚本的参数,不加引号和$@是一样的 加了引号;例如"$*" 则表示单个字符串。相当于"$1 $2 $3"
    $@:同样也是获取当前shell的参数,不加引号和$*是一样的,那么加了引号如:"$@" 表示将所有的参数视为不同独立的字符串,相当于"$1" "$2"..
    总结:$*和$@不加双引号 是没有任何区别的,有双引号两者就有区别


    1)$1 $2 特殊变量实战

    [root@yankerp src]# cat test.sh  #查看脚本的内容  
    #!/bin/bash  
    echo $1     ---<定义了$1  
    [root@yankerp src]# source test.sh yankai #执行的脚本的时候将yankai赋值给脚本中的1  
    yankai                  #输出yankai  
    [root@yankerp src]#  
    [root@yankerp src]# cat test.sh  #脚本内容  
    #!/bin/bash  
    echo $1  
    [root@yankerp src]# source test.sh zhangsan lisi  #zhansgan lisi是两个字符串以空格分割  
    zhangsan            #只输出了zhangsan,因为脚本中只定义了$1  
    [root@yankerp src]#   
    [root@yankerp src]# cat test.sh #查看脚本的内容  
    #!/bin/bash  
    echo $1  
    [root@yankerp src]# source test.sh "zhangsan lisi" #加双引号表示一个字符串参数  
    zhangsan lisi        #最后输出结果为zhangsan lisi  
    [root@yankerp src]#  

    在脚本中添加$1 $2测试:

    [root@yankerp src]# cat test.sh  #查看脚本的内容  
    #!/bin/bash  
    echo $1 $2        定义了$1 $2  
    [root@yankerp src]# source test.sh zhangsan lisi #在执行脚本的时候定义了两个字符串  
    zhangsan lisi        #说明 zhangsan赋值给了$1 lisi赋值给了$2 输出结果为 zhangsan lisi  
    [root@yankerp src]#  

    同时也可以这样加双引号 如下:

    [root@yankerp src]# cat test.sh #查看脚本的内容  
    #!/bin/bash  
    echo $1 $2  
    [root@yankerp src]# source test.sh "zhangsan lisi" yankai #""表示一个字符串   
    zhangsan lisi yankai    #输出结果  
    [root@yankerp src]#  

    2)当我们一个个的输入echo $1---15时会感觉很慢我们可以使用以下命令来接收命令传递的15个参数

    [root@yankerp src]# echo \${1..15}  
    $1 $2 $3 $4 $5 $6 $7 $8 $9 $10 $11 $12 $13 $14 $15  
    将输出的内容导入到test.sh文件中
    [root@yankerp src]# echo \${1..15} > test.sh   
    [root@yankerp src]# cat test.sh   
    $1 $2 $3 $4 $5 $6 $7 $8 $9 $10 $11 $12 $13 $14 $15  
    [root@yankerp src]# 

    我们在脚本第一行加入echo 

    echo $1 $2 $3 $4 $5 $6 $7 $8 $9 $10 $11 $12 $13 $14 $15 

    3)打印26个字母如下

    [root@yankerp src]# echo {a..z}   
    a b c d e f g h i j k l m n o p q r s t u v w x y z  

    传入26个字母a-z 作为26个参数

    [root@yankerp src]# cat test.sh   
    echo $1 $2 $3 $4 $5 $6 $7 $8 $9 $10 $11 $12 $13 $14 $15 #脚本内容  
    [root@yankerp src]# source test.sh {a..z}   #传入26个字母  
    a b c d e f g h i a0 a1 a2 a3 a4 a5      #位置参数大于9后,输出的内容就不对了  
    [root@yankerp src]#  

    当位置参数大于9时 上面已经提到了我们可以使用{}来定义如下:

    [root@yankerp src]# cat test.sh   
    echo $1 $2 $3 $4 $5 $6 $7 $8 $9 ${10} ${11} ${12} ${13} ${14} ${15} 

    再次·执行

    [root@yankerp src]# source test.sh {a..z} 
    a b c d e f g h i j k l m n o

    4)$0特殊变量实战

    [root@yankerp src]# cat y.sh   
    #!/bin/bash  
    echo $0  

    当我们不带路径运行脚本,它会打印脚本的名称,如下

    [root@yankerp src]# sh y.sh   
    y.sh 
    当我们带绝对路径来执行脚本时,它会输出路径+脚本名
    
    [root@yankerp src]# sh /usr/local/src/y.sh   
    /usr/local/src/y.sh  
    介绍dirname ---- basename
    [css] view plain copy
    [root@yankerp src]# dirname /usr/local/src/y.sh   
    /usr/local/src  
    [root@yankerp src]# basename /usr/local/src/y.sh   
    y.sh  


    ·dirname功能:获取脚本的路径
    ·basename:获取脚本的名称

    例如:

    [root@yankerp src]# cat y.sh   
    #!/bin/bash  
    dirname $0  
    basename $0  
    [root@yankerp src]# sh /usr/local/src/y.sh   
    /usr/local/src  
    y.sh  
    [root@yankerp src]# 

    5)$#特殊变量获取传参个数实践

    [root@yankerp src]# cat test.sh   
    echo $1 $2 $3 $4 $5 $6 $7 $8 $9   < 9个位置参数变量  
    echo $#   <----加入$#  
    [root@yankerp src]# source test.sh {a..z}   <传入26个字符  
    a b c d e f g h i    -----<只接收9个变量  
    26  ----<传入26个字符。因此这里显示26  
    [root@yankerp src]#  

    实例1:条件表达式判断语句如下:

    #!/bin/bash  
    [ $# -ne "2" ] && {       #如果用户输入的传参个数不等于2  
      echo "请输出正确的数值" #那么输出此信息  
      exit 1                  #随后退出脚本  
    }  
    echo "输入正确"           #如果输入的传参个数是2 那么就输出此信息  


    运行脚本如下:

    [root@yankerp src]# sh p.sh 
    请输出正确的数值 
    [root@yankerp src]# sh p.sh zhangsan lisi 
    输入正确 
    [root@yankerp src]#

    IF语句判断如下:

    #!/bin/bash  
    if [ $# -ne "2" ]      -------如果输入的传参个数不是2  
      then                 ------那么  
          echo "/usr/local/src/ $0 请输入正确的值"   --输出一个/usr/local---路径加$0 $0表示输出运行脚本的名称  
      else  
          echo "输入正确"  
    fi  

    执行如下:

    [root@yankerp src]# sh p.sh   
    /usr/local/src/ p.sh 请输入正确的值  
    [root@yankerp src]# sh p.sh  zhangsan lisi  
    输入正确  
    [root@yankerp src]#

    二、shell进程中特殊状态变量

    $?    $$(不常用)   $!(不常用)    $_(不常用)$$ 和 $!都是获取脚本进程号PID,但是有所不同这里不在演示

    1、$?特殊变量实践

    [root@yankerp ~]# pwd  
    /root  
    [root@yankerp ~]# echo $?  
    0  
    [root@yankerp ~] 

    当我们执行每一条命令结束后,echo $? 如果它输出0那么就代表成功

    [root@yankerp ~]# sfkljlfsdfsdf 
    bash: sfkljlfsdfsdf: 未找到命令... 
    [root@yankerp ~]# echo $? 
    127 
    [root@yankerp ~]#

    非0则代表失败。
    案例:安装Apache判断是否安装成功

    [root@yankerp ~]#yum install httpd -y

    案例2:通过脚本控制命令及脚本执行返回值

    #!/bin/bash  
    if [ "$#" -ne "3" ]  
      then  
        echo "/bin/bash $0" 请输出正确字符  
        exit 120    ---<如果以上不成立 并指定120值退出脚本  
      else  
        echo "输入正确"  
    fi  

    运行如下:

    [root@yankerp ~]# sh k.sh   
    /bin/bash k.sh 请输出正确字符  
    [root@yankerp ~]# echo $?  
    120  
    [root@yankerp ~]#   
    [root@yankerp ~]# sh k.sh zhangsan lisi wangwu  
    输入正确  
    [root@yankerp ~]# echo $?  
    0  
    [root@yankerp ~]# 

    希望对您有所帮助,再见~~~

  • 相关阅读:
    联想 Vibe Shot(Z90-3) 免recovery 获取ROOT权限 救砖 VIBEUI V3.1_1625
    联想 Z5S(L78071)免解锁BL 免rec 保留数据 ROOT Magisk Xposed 救砖 ZUI 10.5.370
    联想 Z5(L78011) 免解锁BL 免rec 保留数据 ROOT Magisk Xposed 救砖 ZUI 10.5.254
    联想 S5 Pro(L78041)免解锁BL 免rec 保留数据 ROOT Magisk Xposed 救砖 ZUI 5.0.123
    第二阶段 冲刺八
    第二阶段 冲刺七
    第二阶段 冲刺六
    第二阶段 冲刺五
    代码大全阅读笔记03
    学习进度十二
  • 原文地址:https://www.cnblogs.com/YankaiJY/p/8831663.html
Copyright © 2011-2022 走看看