#首先按顺序解释各个参数的含义

1.$0  表示脚本的文件名,

具体的路径信息和执行命令时的相对位置有关,例如

sakura@mi-OptiPlex-7050:~/sh$ sh args.sh
args.sh

sakura@mi-OptiPlex-7050:~$ sh sh/args.sh
sh/args.sh

2.$1,$2,... 表示具体的参数

3.$#  实际传入的参数的个数

4.$$  执行当前shell的进程pid

5.$? 上次执行的返回值,一般0表示成功.

#关于$@,$*,"$@","$*"的对比和及向java传参的对比

首先$@,$*都表示shell脚本接受的参数列表,不包括$0

其次"$@"中的""表示弱引用,即会对$后的变量进行替换.

通过以下shell脚本和java代码,可以清晰的看清楚四者的区别

echo '------------------$@-------------------'
echo $@
for arg in $@
do
echo -n "$arg,"
done
echo
java Test $@
echo '------------------$*-------------------'
echo $*
for arg in $*
do
echo -n "$arg,"
done
echo
java Test $*
echo '------------------"$@"-------------------'
echo "$@"
for arg in "$@"
do
echo -n "$arg,"
done
echo
java Test "$@"
echo '------------------"$*"-------------------'
echo "$*"
for arg in "$*"
do
echo -n "$arg,"
done
echo
java Test "$*"
import java.util.Arrays;

public class Test {
public static void main(String[] args) {
System.out.println("java arg length: "+args.length);
System.out.println("java arr: "+Arrays.toString(args));
}
}

执行 sh test.sh 1 ab 3,输出如下

------------------$@-------------------
1 ab 3
1,ab,3,
java arg length: 3
java arr: [1, ab, 3]
------------------$*-------------------
1 ab 3
1,ab,3,
java arg length: 3
java arr: [1, ab, 3]
------------------"$@"-------------------
1 ab 3
1,ab,3,
java arg length: 3
java arr: [1, ab, 3]
------------------"$*"-------------------
1 ab 3
1 ab 3,
java arg length: 1
java arr: [1 ab 3]

执行sh test.sh 输入如下

------------------$@-------------------

java arg length: 0
java arr: []
------------------$*-------------------

java arg length: 0
java arr: []
------------------"$@"-------------------

java arg length: 0
java arr: []
------------------"$*"-------------------

,
java arg length: 1
java arr: []

结论

$*,$@一样,都是传递整个参数列表,但是当被""引用时,$@不变,为多个字符串,而$*为一个字符串,并且如果这个参数列表为空,则字符串为空字符串,而非不存在.

随机推荐

  1. e代驾狂野裁员 O2O逐渐恢复理智?

    O2O逐渐恢复理智?" title="e代驾狂野裁员 O2O逐渐恢复理智?">     近段时间以来,O2O行业堪称"哀鸿遍野",十分凄惨.巨头 ...

  2. 招聘,api、app、web自动化,性能,持续集成,其他

    招聘: api接口自动化测试 app功能自动化测试 web功能自动化测试 性能测试 自动化平台与持续集成 其他

  3. C++扬帆远航——11(斐波那契数列)

    /* * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:Feibo.cpp * 作者:常轩 * 微信公众号:Worldh ...

  4. 非对称加密算法RSA 学习

    非对称加密算法RSA 学习 RSA加密算法是一种非对称加密算法.RSA是1977年由罗纳德·李维斯特(Ron Rivest).阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Ad ...

  5. java ThreadPoolExecutor初探

    导读:线程池是开发中使用频率比较高的组件之一,但是又有多少人真正了解其内部机制呢. 关键词:线程池 前言 线程池是大家开发过程中使用频率比较高的组件之一,但是其内部原理又有多少人真正清楚呢.最近抽时间 ...

  6. 难道同事:Java 方法调用到底是传值还是传引用

    Java 方法调用中的参数是值传递还是引用传递呢?相信每个做开发的同学都碰到过传这个问题,不光是做 Java 的同学,用 C#.Python 开发的同学同样肯定遇到过这个问题,而且很有可能不止一次. ...

  7. 🤢保护眼睛,从更换win电脑主题开始🤢

    目的: win电脑主题颜色设置为

  8. 使用EventBus + Redis发布订阅模式提升业务执行性能(下)

    前言 上一篇博客上已经实现了使用EventBus对具体事件行为的分发处理,某种程度上也算是基于事件驱动思想编程了.但是如上篇博客结尾处一样,我们源码的执行效率依然达不到心里预期.在下单流程里我们明显可 ...

  9. 前端开发--nginx篇

    安装和启动 Mac上搭建nginx教程 通过Homebrew 安装nginx brew install nginx 配置 添加配置文件在 /usr/local/etc/nginx/servers 目录 ...

  10. Oracle 11g rac中关于crsctl stop cluster/crs/has的区别

    转载至http://www.oracleplus.net/arch/1203.html,整理后得. 1 通过命令查看cluster/has/crs管理的内容 [root@11rac1 ~]# crsc ...