一文教你入门shell脚本2.0——Shell特殊变量:Shell $#、$*、$@、$?、$$以及浅谈$* 和$@的区别

Shell特殊变量

1、Shell特殊变量

1.1、Shell特殊变量表以及作用

变量名称 作用
$0 当前脚本的文件名。
$n(n≥1 传递给脚本或函数的参数。n 是一个数字,表示第几个参数。例如,第一个参数是 $1,第二个参数是 $2。
$# 传递给脚本或函数的参数个数。
$* 传递给脚本或函数的所有参数。
$@ 传递给脚本或函数的所有参数。当被双引号" "包含时,$@ 与 $* 稍有不同
$? 上个命令的退出状态,或函数的返回值
$$ 当前 Shell 进程 ID。对于 Shell 脚本,就是这些脚本所在的进程 ID。

1.2、给脚本文件传递参数

#!/bin/bash

echo "Process ID: $$"
echo "File Name: $0"
echo "First Parameter : $1"
echo "Second Parameter : $2"
echo "All parameters 1: $@"
echo "All parameters 2: $*"
echo "Total: $#"

运行 test.sh,并附带参数:
在这里插入图片描述

1.3、给函数传递参数

#!/bin/bash

#定义函数
function func(){
    echo "Language: $1"
    echo "URL: $2"
    echo "First Parameter : $1"
    echo "Second Parameter : $2"
    echo "All parameters 1: $@"
    echo "All parameters 2: $*"
    echo "Total: $#"
}

#调用函数
func Java hello

在这里插入图片描述

2、浅谈 $ * 和$ @的区别

$*$@是Shell的特殊变量,作用都是获取传递给脚本或函数的所有参数。在没有被双引号包围时,两者没有区别,都是将接受到的每个参数都是独立的,用空格分隔。也就是说下面两段代码是等效的。

#!/bin/sh
foo(){
 echo $*

}
bar(){
 echo $@
}
foo 1 2 3 4 
bar 1 2 3 4 

在这里插入图片描述
那么$*$@的区别在哪里?,加双引号以后进行试验:”

#!/bin/bash

test_param() {
  echo "Receive $# parameters"
  echo Using '$*'

  echo
  for param in $*; do
    printf '==>%s<==\n' "$param"
  done;

  echo
  echo Using '"$*"'
  for param in "$*"; do
    printf '==>%s<==\n' "$param"
  done;

  echo
  echo Using '$@'
  for param in $@; do
    printf '==>%s<==\n' "$param"
  done;

  echo
  echo Using '"$@"';
  for param in "$@"; do
  printf '==>%s<==\n' "$param"
  done
}

IFS="^${IFS}"

test_param 1 2 3 "a b c"

输出结果
在这里插入图片描述

  • "$*" 会把所有位置参数当成一个整体(或者说当成一个单词),如果没有位置参数,则"$*"为空,如果有两个位置参数并且IFS为空格时,"$*"相当于"$1 $2"
  • "$@" 会把所有位置参数当成一个单独的字段,如果没有位置参数($#为0),则"$@"展开为空(不是空字符串,而是空列表),如果存在一个位置参数,则"$@"相当于"$1",如果有两个参数,则"$@"相当于"$1" "$2"等等

3、$?获取函数返回值或者上一个命令的退出状态

$? 是一个特殊变量,用来获取上一个命令的退出状态,或者上一个函数的返回值。

所谓退出状态,就是上一个命令执行后的返回结果。退出状态是一个数字,一般情况下,大部分命令执行成功会返回 0,失败返回 1,这和C语言的 main() 函数是类似的。

3.1、$? 获取上一个命令的退出状态

#!/bin/bash

if [ "$1" == 100 ]
then
   exit 0  #参数正确,退出状态为0
else
   exit 1  #参数错误,退出状态1
fi

exit表示退出当前 Shell 进程,我们必须在新进程中运行 test.sh,否则当前 Shell 会话(终端窗口)会被关闭,我们就无法取得它的退出状态了。
在这里插入图片描述

3.2、$? 获取函数的返回值

#!/bin/bash

#得到两个数相加的和
function add(){
    return `expr $1 + $2`
}

add 23 50  #调用函数
echo $?  #获取函数返回值

在这里插入图片描述

参考

1、http://c.biancheng.net/view/806.html
2、https://www.cnblogs.com/Template/p/9182534.html

猜你喜欢

转载自blog.csdn.net/JMW1407/article/details/107404081