Shell特殊变量讲解:$n、$#、$*、$@、$?、$$各自代表的意思及用法

$n

  • 语法:$n,含义:用于接收shell脚本文件执行时传入的参数。

    $0
    #用于获取当前脚本文件名称

    $1~$9
    #代表输入的第一个参数到第9个参数 # 这都不用括号(要也不影响)

    第10个以上就用 数 字 比 如 {数字} 比如 {12} # 后面这些都必须要{ }括号

简单示例编辑一个名为456.sh的shell脚本:

#!/bin/bash

echo $0
echo "输入的第一个参数:$1"
echo "输入的第二个参数:$2"
echo "输入的第11个参数:${11}"

执行:bash 456.sh 11 22 33 44 55 66 77 88 99 1010 1111,获取的结果如下:
在这里插入图片描述

$#

  • 语法:$#,含义:获取shell脚本所有输入参数的个数(输入2个就是2个)。

    • echo "参数个数:${#}"
    • echo 参数个数:$#
      # 里面也不一定要引号,两行效果是一样的。

    Tips:

    • 强烈注意:在这里面,使用单引号,里面的内容会原样输出,里面加的任何变量,无论带括号不,都是原样输出;
    • 建议,使用双引号里面变量就加上{},没有引号就不要这{},(引号与{}有无在这里都没有影响)

$* and $@

  • 语法:$*$@,含义:都是获取所有传入参数,用于后续输出所有参数。

区别:

  • 直接原样,不用双引号括起来,那两者一样,都是原样

    echo '直接输出$*:'$*         # var1 var2 ... varn
    echo '直接输出$@:'$@         # var1 var2 ... varn   # 两者是一样的
    
  • 使用双引号括起来(不能是单引号,参上的Tips):那么"$*"跟上一样的,就是将这些拼接起来的字符串;而"$@"则是一个数组,是可以一个个取的,用循环验证。

简单示例(编辑一个名为456.sh的shell脚本):

#!/bin/bash

for item in "$*"          # 结果就是全部打印出来
do
    echo $item
done             
          
echo "************************"
                 # 这也是shell中的循环写法
for item in "$@"
do
    echo $item        # 这里也可以${item},但记得上面Tips
done 

执行:bash 456.sh 11 nihao 123 hello abc 456,结果如下:
在这里插入图片描述

$?

  • $?,含义:用于获取上一个shell命令的退出状态码,或者是函数的返回值

      echo "hello"
      echo $?        # 上一条肯定执行成功,这就会得到0
    

    得到0就代表执行成功,非0就是不成功

$$

  • $$,含义:用于获取当前shell环境的进程ID号

    • ps aux | grep bash
      echo $$           # 交互式shell下,这俩都是一样的