shell中传参的坑之:“$@与$*”区别解读!

前言:shell中的函数的参数是不能在创建函数的在函数的括号中直接写上形参的,只能通过位置变量($n)与预定义变量中的:“$@”与“$*” 进行传参!书上与网上给出了它们两个的区别:“当 $* 和 $@ 不带双引号时它们两个是没有区别的,都是接收所有参数然后分别单独处理每个参数!而当$*带双引号的时候,会把接收的所有参数当成一个字段处理!" 而我在函数中使用“$@”与“$*” 进行传参的时候得到的却是不一样的结果!下面我们就来看一下到底是为什么?


探究的问题:

# 1. 预定义变量: $@
function fun04() {
    echo "$*"  # 带引号
}
result01=$(fun04 1 2 3 4 5)
echo "fun04函数结果:$result01"
for m in $result01
do 
    echo "循环result01:$m"
done

# 2.预定义变量:$*

function fun05(){
    echo "$@" # 带引号
}
result02=$(fun05 1 2 3 4 5 6 )
echo "fun05函数结果:$result02"
for n in $result02
do 
    echo "循环result02:$n"
done

result:

ps:如上结果在为什么在函数中调用的时候,带引号的$*跟不带引号的$*结果一样,跟书上与网上给的结论不一样!如下我们来论证一下书上的结论:


1.带双引号的时候:

# **********shell"$@"与"$*"区别********
echo "下面是 \"\$*\"的debug代码"
for var in "$*"
do
    echo "$var"
done
echo "下面是 \"\$@\"的debug代码"
for var in "$@"
do
    echo "$var"
done

result:

ps:如上带引号的"$*"值循环了一次,按照前言中的结论因为$*把所有参数当成了一个字段处理,所有它只循环了一次!而$@是单独处理每个参数所以传入的所有参数都进行了遍历循环!

2.不带引号的时候:

# **********shell"$@"与"$*"区别********
echo "下面是 \"\$*\"的debug代码"
for var in $*
do
    echo "$var"
done
echo "下面是 \"\$@\"的debug代码"
for var in $@
do
    echo "$var"
done

result:

ps: 由上面的打印结果来看确实验证了:“当 $* 和 $@ 不带双引号时它们两个是没有区别的,都是接收所有参数然后分别单独处理每个参数!而当$*带双引号的时候,会把接收的所有参数当成一个字段处理 “的结论!


3.将$@与$*初始化给变量:

带引号:

# **********shell"$@"与"$*"区别********
echo "下面是 \"\$*\"的debug代码"
adi_one="$*"
for var in $adi
do
    echo "$var"
done
echo "下面是 \"\$@\"的debug代码"
adi_tow="$@"
for var in $adi_tow
do
    echo "$var"
done

result:

不带引号:

# **********shell"$@"与"$*"区别********
echo "下面是 \"\$*\"的debug代码"
adi_one=$*
for var in $adi_one
do
    echo "$var"
done
echo "下面是 \"\$@\"的debug代码"
adi_tow=$@
for var in $adi_tow
do
    echo "$var"
done

result:

ps:如上结果得知,将$@与$*赋值给变量之后,结果跟不带引号是一样的!这是我们需要注意的地方,当$*赋值给变量的时候还是跟不带引号的作用是一样的!这也是在前面探究问题的代码中在函数中使用$*进行函数传递的时候不是按照网上跟书上的定论将所有参数当成一个字段处理,而是跟不带引号的作用一样!

今日启发:实践是检验真理唯一标准!

おすすめ

転載: blog.csdn.net/qq_43082279/article/details/118346421