当前位置 博文首页 > Shell编程之特殊变量的笔记小结

    Shell编程之特殊变量的笔记小结

    作者:789-yankerp 时间:2021-02-15 09:09

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

    1、在shell中存在着一些特殊而又重要的变如:$1 $0 $#,我们称为特殊的位置变量要从命令行,函数,脚本,等传递参数时,就需要在shell脚本中使用位置参数变量

    1. $0:显示当前的脚本文件名,如果在执行脚本时添加了路径,那么全部都会输出
    2. $n:获取当前执行的shell脚本的第n个参数值比如:[n=1..9],如果N大于9那么就要使用{}来定义 比如${10}
    3. $#:获取当前shell脚本后面接的参数的个数
    4. $*:获取当前脚本的参数,不加引号和$@是一样的 加了引号;例如"$*" 则表示单个字符串。相当于"$1 $2 $3"
    5. $@:同样也是获取当前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]# 

    例2:

    [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]#  

    例3:

    [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]# 

    例4:在脚本中添加$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

    [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 ~]#  

    声明:以上文章是<<跟着老男孩学Linux运维Shell编程实战>>第四章看完的总结;

    js
    下一篇:没有了