#!/bin/bash

#Author:Sparrow
#Name:explain_shell_parameters
#Date 2020-3-11

#Description:
#Explain what $0 $1 $2 $3 $4 $@ $* $# mean

#Program begin
#Ensure enter six parameters at least
if [ $# -le 6 ];then
        echo "Please enter 6 parameters at least!"
        exit 1
fi

#Echo every $
echo "\$0  ---------  $0"
echo "\$1  ---------  $1"
echo "\$2  ---------  $2"
echo "\$3  ---------  $3"
echo "\$4  ---------  $4"
echo "\$5  ---------  $5"
echo "\$6  ---------  $6"
echo "\$7  ---------  $7"
echo "\$8  ---------  $8"
echo "\$#  ---------  $#"
echo "\$@  ---------  $@"
echo "\$*  ---------  $*"
echo "\$?  ---------  $?"

l输出结果

sh explain_shell_parameters.sh 1 2 3 4 5 6 7 8

#结果
#$0即脚本名
$0  ---------  explain_shell_parameters.sh 
$1  ---------  1 
$2  ---------  2 
$3  ---------  3 
$4  ---------  4 
$5  ---------  5 
$6  ---------  6 
$7  ---------  7 
$8  ---------  8 
$#  ---------  8 
$@  ---------1 2 3 4 5 6 7 8 
$*  ---------  1 2 3 4 5 6 7 8
#上一条语句的执行结果
$?  ---------  0


$* 和 $@ 的区别

 当 $* 和 $@ 不被双引号 " "包围时,它们之间没有任何区别,
 都是将接收到的每个参数看做一份数据,彼此之间以空格来分隔。
 但是当它们被双引号" "包含时,就会有区别了:
 
"$*"会将所有的参数从整体上看做一份数据,而不是把每个参数都看做一份数据。
"$@"仍然将每个参数都看作一份数据,彼此之间是独立的。

比如传递了 5 个参数,那么对于"$*"来说,
这 5 个参数会合并到一起形成一份数据,它们之间是无法分割的;

而对于"$@"来说,这 5 个参数是相互独立的,
它们是 5 份数据。
如果使用 echo 直接输出"$*"和"$@"做对比,是看不出区别的;
但如果使用 for 循环来逐个输出数据,立即就能看出区别来。