$@和 $*-linux_Shell

=================1.问题=======

在使用$@和 $*的时候有时候会混淆。

================2.实践出真知=====

分别用三种参数设置:

"a b c"   "a" "b" "c"   a b c

2.0先看$@,编写测试脚本

root@ubuntu:/tmp# vim demo.sh

#/bin/bash
echo "$@=$@"
echo "$*=$*"
echo "The Number Of Parameter:$#"

for var in "$@"         <===主要变化在这里
do
        echo "${var}@"
done

2.1测试"a b c",结果为 a b c@  ===>"a b c" 是一个参数

root@ubuntu:/tmp# ./demo.sh "a b c"
$@=a b c
$*=a b c
The Number Of Parameter:1
a b c@

2.2测试"a" "b" "c",结果为

a@
b@
c@                 ===>"a" "b" "c" 为三个参数
root@ubuntu:/tmp# ./demo.sh "a" "b" "c"
$@=a b c
$*=a b c
The Number Of Parameter:3
a@
b@
c@

2.3测试a b c,结果为

a@
b@
c@                ===>  "a" "b" "c" 为三个参数       
root@ubuntu:/tmp# ./demo.sh a b c
$@=a b c
$*=a b c
The Number Of Parameter:3
a@
b@
c@

3.0 测试$*,修改脚本如下

root@ubuntu:/tmp# vim demo.sh 

#/bin/bash
echo "$@=$@"
echo "$*=$*"
echo "The Number Of Parameter:$#"

for var in "$*"              <===主要修改在这
do
        echo "${var}@"
done

3.1测试"a b c",结果为 a b c@

root@ubuntu:/tmp# ./demo.sh "a b c"
$@=a b c
$*=a b c
The Number Of Parameter:1
a b c@

3.2测试"a" "b" "c",结果为

root@ubuntu:/tmp# ./demo.sh "a" "b" "c"
$@=a b c
$*=a b c
The Number Of Parameter:3
a b c@

3.3测试a b c,结果为

root@ubuntu:/tmp# ./demo.sh a b c
$@=a b c
$*=a b c
The Number Of Parameter:3
a b c@

=====================3.总结===================

结论:不管参数的个数有多少个,或者是否加双引号(“”),在for循环下  for var in "$*"   中的$*都表示一个参数,也只执行一次循环(如果想查看执行了多少次循环,执行脚本的时候使用 bash  -x 脚本文件名)

在for循环中使用$@和$* $@ $*
"a b c" a b c@ a b c@
"a" "b" "c" a@
b@
c@
a b c@
a b c a@
b@
c@
a b c@

==================4.收工========================

扩展:

shell中的特殊变量:
变量名
含义
$0
shell或shell脚本的名字
$*
以一对双引号给出参数列表
$@
将各个参数分别加双引号返回
$#
参数的个数
$_
代表上一个命令的最后一个参数
$$
代表所在命令的PID
$!
代表最后执行的后台命令的PID
$?
代表上一个命令执行后的退出状态

原文地址:https://www.cnblogs.com/horizonli/p/5246066.html