=================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:
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:
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:
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:
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:
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:
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
$?
代表上一个命令执行后的退出状态

随机推荐

  1. 微信小程序省市区选择器对接数据库

    前言,小程序本身是带有地区选着器的(网站:https://mp.weixin.qq.com/debug/wxadoc/dev/component/picker.html),由于自己开发的程序的数据是很 ...

  2. Java集合之LinkedList源码解析

    LinkedList简介 LinkedList基于双向链表,即FIFO(先进先出)和FILO(先进后出)都是支持的,这样它可以作为堆栈,队列使用 继承AbstractSequentialList,该类 ...

  3. Windows上使用sqlite3

    安装 去官网http://www.sqlite.org/download.html下载Windows下安装包,下载后,解压,设置环境变量 例如放在D:\sqlite3下,将D:\sqlite3加入环境 ...

  4. python中的字符串常量,是否支持通过下标的方式赋值

    说明: 今天在看python,通过下标获取字符串常量的字符,在想是否可以通过下标的方式赋值. 操作: 1.对字符串下标赋值 >>> text='python' >>> ...

  5. [原]unity调Android(三)

    private UnityPlayer mUnityPlayer;    @Override    protected void onCreate(Bundle savedInstanceState) ...

  6. ios7注意事项随笔

    1,修改状态栏的样式和隐藏. 首先,需要在Info.plist配置文件中,增加键:UIViewControllerBasedStatusBarAppearance,并设置为YES: 然后,在UIVie ...

  7. 如何把JavaScript数组中指定的一个元素移动到第一位

    目的:通过LocalStrorage实现存储搜索历史--结合store.js实现 代码如下: function addSearchHistory(key,value) { var oldArr = s ...

  8. SpringBoot Cmd运行Jar文件指定active文件的命令如下

    SpringBoot Cmd运行Jar文件指定active文件的命令如下 SpringBoot 命令行指定配置文件运行 ================================ ©Copyri ...

  9. 【ArcGIS】WebAdaptorIIS 安装前准备及配置Portal For ArcGIS的问题解决

    1.计算机全名配置 2.IIS-服务器证书配置 3.端口绑定 备注:配置Portal For ArcGIS总会提示计算机域名.全名错误.完全限定域名,可能就是没有进行第一步操作 4.Portal目录

  10. PHP代码审计笔记--SQL注入

    0X01 普通注入 SQL参数拼接,未做任何过滤 <?php $con = mysql_connect("localhost","root"," ...