最近发现网上有不少人问${1+"$@"}是什么意思,希望这篇文章能很彻底的回答这个问题。

首先,我想绝大多数人明白“参数展开”的概念。比如${variable},在脚本执行的时候,会自动替换成变量的值。例如下面的例子,会将"Hello world!"输出,而不是"$message"。

$message="Hello world!"

echo $message

这里用大括号{}将变量名括起来,目的防止变量之后紧跟着的字符被解释成变量名的一部分。例如下面的例子,必须用{}将message括起来,否则message_会被解释成变量名。

$message="Hello world!"

echo ${message}_

上面只是参数展开最基本的应用,而实际使用中,在{}里面可以加入各种运算符,就是运算符展开了。下面是几种典型的运算符展开方式。

1) ${varname:-word}

如果varname存在且非null, 则返回其值;否则返回word。主要用于在给变量定义默认值的场景。例如如果count未定义,则${count:-0}的值为0。

2) ${varname:=word}

如果varname存在且非null, 则返回其值;否则设置它为word,并返回其值。主要用于给变量设置默认值的场景。例如如果count未定义,则${count:=0}则设置count为0。这里要注意和1)的区别,在1)中,并不会改变count的值。

3)${varname:?message}

如果varname存在且非null, 则返回其值;否则显示varname: message,并退出当前的脚本。省略message,则显示默认信息parameter null or not set。例如如果count未定义,则$count:?"undefined!"}将显示count:undefined!。

4) ${varname:+word}

如果varname存在且非null, 则word;否则,返回null。例如如果count已定义,则${count:+1}返回1。

注意,每个运算符里面的冒号都是可选的。所以4)正好回答了本文标题的问题。${1+"$@"}意思是如果第一个参数$1定义了,则返回"$@",否则返回null。$@是传递给当前脚本的命令行参数,置于双引号内,会展开为个别的参数。我相信看到这里,大部分人心里会有两点疑问:

1、为什么要将$@置于双引号内?

2、${1+"$@"}到底有什么用,为什么不能直接用"$@"?

首先来解释第一个问题。假如有如下脚本test.sh,

#!/bin/sh

echo "Begin to invoke JAVA program..."

......

$JAVA $JAVA_OPTS  com.test.projectA.moduleA.TestMain  $@

而当你这样调用这个脚本:

sh  test.sh  10  'Hello world'

你期望传给TestMain的是两个参数,而实际上TestMain收到了3个参数,分别是:10,'Hello, world'。这就是为什么要将$@置于双引号内的原因。这样我们就回答了第一个问题。

再来看第二个问题。假如有下面的脚本,

   $ cat args.shfor i in "$@"; doecho arg: \"$i\"done

如果你至少提供了一个参数,那么你能得到预期的输出,例如,

   $ sh args.sh 1 2arg: "1"arg: "2"

然后,如果你没有提供任何参数,你期望没有任何输出,而实际你仍然能得到一个空输出,例如,

   $ sh args.sharg: ""

这就是为什么要用${1+"$@"},而不直接用"$@"的原因。

本文到此回答了所有问题。

Benjamin Wang @ Beijing

2015-3-16 13:16

最新文章

  1. 2.0 解析系列 | 一文详解新一代OceanBase云平台
  2. 外国小哥恶搞:用ESP32单片机伪装成GPU,让朋友电脑中“勒索病毒
  3. python3邮件_python3使用SMTP发送HTML格式邮件
  4. Linux-pstree命令
  5. 使用机器学习预测电子竞技游戏《守望先锋》的胜负
  6. ArcGIS 的 http://localhost:8399/arcgis/rest/services 无法打开,显示404 的解决办法
  7. AJAX实例演示加载xml
  8. 网管面试题1-windows
  9. 防止linux子系统关闭,Linux关闭selinux安全子系统的方法
  10. 从实战思路学习前端的设计模式
  11. 向日葵远程控制工具安装
  12. 【DP专题】——洛谷P5144蜈蚣
  13. 天然产物分子机制研究(内含彩蛋)——药物靶点预测系统案例分析2
  14. 国际象棋棋盘64个格子能容纳多少粒米
  15. 庄懂着色器_L21_CyberPunk
  16. python运算均值方差_Python 做大量组合的均值方差模型
  17. 如何在微信小程序里实现聊天室功能?
  18. QT 5.9学习笔记
  19. Python读取PSV
  20. uniapp jql操作数据库

热门文章

  1. Linux下smba服务端的搭建和客户端的使用
  2. 【自动驾驶】杜明芳:基于多尺度IPM图的车道线检测实现
  3. Android看韩漫软件,第一韩漫app-第一韩漫安卓版v1.0
  4. 稳健估计的可靠性分析
  5. C型电磁阀连接器电磁阀插头,8mm针距
  6. c语言高级语言控制成分while,这衣服收费的形式特征有
  7. javaweb项目通过natapp实现项目让外网访问
  8. 机器人学习NO2.导航和路径规划
  9. Visual Studio 2005 注册码
  10. Android 环信 自定义聊天气泡