shell学习之[email protected] 与 $* 差在哪?

要说 [email protected] 与 $* 之前,需得先从 shell script 的 positional parameter 谈起...

我们都已经知道变量(variable)是如何定义及替换的,这个不用再多讲了。

但是,我们还需要知道有些变量是 shell 内定的,且其名称是我们不能随意修改的,

其中就有 positional parameter 在内。在 shell script 中,我们可用 $0, $1, $2, $3 ... 这样的变量分别提取命令行中的参数,

如ls -l          ls为$0, -l为$1

首先是 $# :它可抓出 positional parameter 的数量。

以前面的 my.sh p1 "p2 p3" 为例:

由于 p2 与 p3 之间的 IFS 是在 soft quote 中,因此 $# 可得到 2 的值

接下来就是 [email protected] 与 $* :

精确来讲,两者只有在 soft quote 中才有差异,否则,都表示"全部参数"( $0 除外)。

举例来说好了:若在 command line 上跑 my.sh p1 "p2 p3" p4 的话,

不管是 [email protected] 还是 $* ,都可得到 p1 p2 p3 p4 就是了。

但是,如果置于 soft quote 中的话:

"[email protected]" 则可得到 "p1" "p2 p3" "p4" 这三个不同的词段(word);

"$*" 则可得到 "p1 p2 p3 p4" 这一整串单一的词段。

我们可修改一下前面的 my.sh ,使之内容如下:

代码:

#!/bin/bash

my_fun() {

echo "$#"

}

echo ‘the number of parameter in "[email protected]" is ‘$(my_fun "[email protected]")

echo ‘the number of parameter in "$*" is ‘$(my_fun "$*")

然后再执行 ./my.sh p1 "p2 p3" p4 就知道 [email protected] 与 $* 差在哪了 ... ^_^

时间: 2024-12-21 17:43:11

shell学习之[email protected] 与 $* 差在哪?的相关文章

shell中$*与[email protected]的区别

$*所有的位置参数,被作为一个单词 注意:"$*"必须被""引用 [email protected] 与$*同义,但是每个参数都是一个独立的""引用字串,这就意味着参数被完整的传递,被没有被解释和扩展,这也意味着每个参数列表中的每个参数都被当成一个独立的单词. 注意:"[email protected]"必须被引用. [email protected],$*只在被双引号包起来的时候才会有差异. 双引号括起来的情况: $*将所有

MVC学习系列[email protected]辅助方法和用户自定义HTML方法

在HTML Helper,帮助类的帮助下,我们可以动态的创建HTML控件.HTML帮助类是在视图中,用来呈现HTML内容的.HTML帮助类是一个方法,它返回的是string类型的值. HTML帮助类,分成三个类型: Inline HTML helpers[内联的HTML帮助类,例如@Html.Label等] Built-in HTML helpers[也就是嵌套的HTML帮助类,即@helper辅助方法] Custom HTML helpers[自定义的HTML帮助类] 在这里,我们学习第二种,

Spring学习记录[email protected] Propagation

起因 学习Spring的时候就知道aop有一个应用是声明式注解..反正往Service上一丢@Transactional就完事了..不用自己去开启hibernate的session,很简单. 但是@Transactional里有很多属性一直没有用过...其中最让我在意的便是Propagation属性...其他属性都还是蛮好理解的..但是这个属性一直不怎么懂,也一直没怎么去研究.. 大部分情况下的确是使用@Transactional不用额外设置就OK了.因为默认的Propagation是Propa

SpringMVC学习笔记[email protected]

@RequestMapping修饰类 @RequestMapping("/springmvc")//此路径是相对于web应用根目录的路径 @Controller public class SpringMVCTest {       private static final String SUCCESS = "success";           /**      * @RequestMapping 除了修饰方法还可以修饰类      * 类定义处:提供初步的请求映

Python学习(十三)[email protected]和property函数

@property @property装饰器可以把一个方法变成属性调用. 举一个例子,对学生成绩进行设置和查询.通过set_score来设置成绩,get_score来获取成绩.这样的不方便之处就是不像直接用属性那么方便. class Student(object): def get_score(self): return self._score def set_score(self, value): if not isinstance(value, int): raise ValueError(

shell学习之条件测试(参考shell脚本编程诀窍)

1关于test测试,查看man文档知 表达式的判断 ( EXPRESSION )                    #EXPRESSION is true ! EXPRESSION                      #EXPRESSION is false EXPRESSION1 -a EXPRESSION2        #both are true,-o means or 字符串是否为空,相等 -n STRING  #the length of STRING is nonzero

shell学习之常用bash内置变量

常用的Bash内置变量 1 BASH_COMMAND当前执行的命令 2 LINENO显示当前所在行号 /bin/bash echo "this is test about ARG LINENO" echo "line now in :$LINENO" 结果为 [[email protected] shell]# ./bash.sh this is test about ARG LINENO line now in :   4 方便调试 3 FUNCNAME[i]在第

shell学习笔记(2)替换命令··与()的区别

·CMD·在执行的时候,shell不管··中的内容是什么,先进性解释,再把解释后的最终结果送给shell,如果解释后的结果不是shell可以行的命令,就会报错.但是仅仅把cmd的执行结果作为文本输出,就没有问题. 如:[[email protected] root]# i=0[[email protected] root]# name=pwd[[email protected] root]# `$i`  # $i已经得到了结果0,再把0送给shell执行,当然出错啦-bash: 0: comma

【shell学习笔记】$#,[email protected],$0,$1,$2的含义解释

http://kodango.com/useful-documents-about-shell $$  shell本身的PID(ProcessID) $!   shell最后运行的后台Process的PID $?   最后运行的命令的返回值,用于检查上一条命令是否执行成功. $*   所有参数列表,作为一个整体. [email protected]  所有参数列表.单独的作为一个整体. $#  添加到Shell的参数个数. $0   Shell 本身的文件名.