SHELL中[email protected]和$*的比较

[[email protected] ceshi]# cat test.sh

#!/bin/bash

# test.sh

echo "-------------ISF is set to \"-seperator\" ------------"

IFS="-seperator";  # 注意 seperator前有一个减号(-)

for i in "[email protected]"; do echo "@ ‘$i‘"; done

for i in "$*"; do echo "* ‘$i‘"; done

echo "-------------ISF is set to null ------------------------"

IFS=

for i in "[email protected]"; do echo "@ ‘$i‘"; done

for i in "$*"; do echo "* ‘$i‘"; done

echo "-------------ISF is unset ------------------------"

unset IFS

for i in "[email protected]"; do echo "@ ‘$i‘"; done

for i in "$*"; do echo "* ‘$i‘"; done

echo ‘---------$* and [email protected] are not put into double quotes(" ")-------‘

for i in [email protected]; do echo "@ ‘$i‘"; done

for i in $*; do echo "* ‘$i‘"; done

test.sh aa bb cc执行的结果如下:

[[email protected] ceshi]# sh test.sh aa bb cc

-------------ISF is set to "-seperator" ------------

@ ‘aa‘

@ ‘bb‘

@ ‘cc‘

* ‘aa-bb-cc‘

-------------ISF is set to null ------------------------

@ ‘aa‘

@ ‘bb‘

@ ‘cc‘

* ‘aabbcc‘

-------------ISF is unset ------------------------

@ ‘aa‘

@ ‘bb‘

@ ‘cc‘

* ‘aa bb cc‘

---------$* and [email protected] are not put into double quotes(" ")-------

@ ‘aa‘

@ ‘bb‘

@ ‘cc‘

* ‘aa‘

* ‘bb‘

* ‘cc‘

由此可见,

1) 当不加双引号("")时, $*,[email protected]被展开时的行为是一样的;

2) 当$*,[email protected]都被放到双引号("")内;

2.1) 如果设置了变量IFS的值并且该值非空, 则$*被展开时使用${IFS}的第一个字符将所有参数(除了参数$0)连接起来, 即"$1c$2c$3c...",其中c表示${IFS}的第一个字符;

2.2) 如果变量IFS为空, 则$*被展开时只是将所有参数(除了参数$0)简单连接起来, 即 “$1$2$3..."

2.3)如果变量IFS没有被定义, 则$*被展开时使用空格字符将所有参数(除了参数$0) 连接起来, 即"$1 $2 $3 ..."

但[email protected]的展开和没有加双引号的情形是一致的。

更多的Shell脚本例子:

#!/bin/bash

set ‘apple pie‘ pears peaches

for i in $* #单引号被去掉,循环单个字符输出#

do echo $i

done

[[email protected] ceshi]# sh test1.sh

apple

pie

pears

peaches

--------------------------------------------------------------

#!/bin/bash

set ‘apple pie‘ pears peaches

for i in "$*" #单引号被去掉,但当作字符串一次输出#

do echo $i

done

[[email protected] ceshi]# sh test2.sh

apple pie pears peaches

-----------------------------------------------------------------

#!/bin/bash

set ‘apple pie‘ pears peaches

for i in [email protected] #单引号被去掉,循环单个字符输出#

do echo $i

done

[[email protected] ceshi]# sh test3.sh

apple

pie

pears

peaches

-----------------------------------------------------------------

#!/bin/bash

set ‘apple pie‘ pears peaches

for i in "[email protected]" #每个位置参数都将当成一个加引号的字符串:"apple pie","pears ","peaches"#

do echo $i

done

[[email protected] ceshi]# sh test4.sh

apple pie

pears

peaches

-----------------------------------------------------------------

test5.sh

sum=0

for var

in "[email protected]"

do

let sum=sum+$var

done

echo "sum=$sum"

./test1.sh 1 2 3

结果为sum=6

-----------------------------------------------------------------

test6.sh

sum=0

for var

in "$*"

do

let sum=sum+$var

done

echo "sum=$sum"

./test2.sh 1 2 3

结果为sum=1

-----------------------------------------------------------------

分析一:

bash -x test1.sh

结果如下:

+ sum=0

+ for var in ‘ "[email protected]" ‘

+ let sum=sum+1

+ for var in ‘ "[email protected]" ‘

+ let sum=sum+2

+ for var in ‘ "[email protected]" ‘

+ let sum=sum+3

+ echo sum=6

sum=6

可以看出for执行了三次,说明for是以""为边界的,因为每个参数是以""被包围的

分析二:

bash -x test2.sh

结果如下:

+ sum=0

+ for var in ‘"$*"‘

+ let sum=sum+1 2 3

+ echo sum=1

sum=1

可以看出循环只执行了一次,说明$*整体是以""包围的,不是每个参数被""包围,因此只执行一次

一个更直接的例子是:

for var

in "a b c"

do

echo "${var}@"

done

打印:

a b [email protected]

for var

in "a" "b" "c"

do

echo "${var}@"

done

打印:

[email protected]

[email protected]

[email protected]

时间: 2024-08-25 19:45:15

SHELL中[email protected]和$*的比较的相关文章

linux中shell变量$#,[email protected],$0,$1,$2的含义解释

摘抄自:ABS_GUIDE 下载地址:http://www.tldp.org/LDP/abs/abs-guide.pdf linux中shell变量$#,[email protected],$0,$1,$2的含义解释: 变量说明: $$ Shell本身的PID(ProcessID) $! Shell最后运行的后台Process的PID $? 最后运行的命令的结束代码(返回值) $- 使用Set命令设定的Flag一览 $* 所有参数列表.如"$*"用「"」括起来的情况.以&qu

inux中shell变量$#,[email protected],$0,$1,$2的含义

转自:http://www.cnblogs.com/fhefh/archive/2011/04/15/2017613.html linux中shell变量$#,[email protected],$0,$1,$2的含义解释: 变量说明: $$ Shell本身的PID(ProcessID) $! Shell最后运行的后台Process的PID $? 最后运行的命令的结束代码(返回值) $- 使用Set命令设定的Flag一览 $* 所有参数列表.如"$*"用「"」括起来的情况.以

【Shell】linux中shell变量$#,[email protected],$0,$1,$2的含义解释 && set 关键字使用

linux中shell变量$#,[email protected],$0,$1,$2的含义解释 摘抄自:ABS_GUIDE 下载地址:http://www.tldp.org/LDP/abs/abs-guide.pdf linux中shell变量$#,[email protected],$0,$1,$2的含义解释: 变量说明: $$ Shell本身的PID(ProcessID) $! Shell最后运行的后台Process的PID $? 最后运行的命令的结束代码(返回值) $- 使用Set命令设定

【转】linux中shell变量$#,[email protected],$0,$1,$2的含义解释

原文网址:http://www.cnblogs.com/fhefh/archive/2011/04/15/2017613.html linux中shell变量$#,[email protected],$0,$1,$2的含义解释: 变量说明: $$ Shell本身的PID(ProcessID) $! Shell最后运行的后台Process的PID $? 最后运行的命令的结束代码(返回值) $- 使用Set命令设定的Flag一览 $* 所有参数列表.如"$*"用「"」括起来的情况

linux中shell变量$#,[email protected],$0,$1,$2的含义

#!/bin/bash #Created by ley on 2014-11-14 #Testing the Paramters echo  "The compleate list is %s\n" "$$" echo  "The compleate list is %s\n" "$!" echo  "The compleate list is %s\n" "$?" echo  &quo

浅谈linux中shell变量$#,[email protected],$0,$1,$2,$?的含义解释

浅谈linux中shell变量$#,[email protected],$0,$1,$2,$?的含义解释 下面小编就为大家带来一篇浅谈linux中shell变量$#,[email protected],$0,$1,$2的含义解释.小编觉得挺不错的,现在就分享给大家,也给大家做个参考.一起跟随小编过来看看吧 摘抄自:ABS_GUIDE 下载地址:http://www.tldp.org/LDP/abs/abs-guide.pdf linux中shell变量$#,[email protected],$

Linux 中 shell 变量 $#,[email protected],$0,$1,$2 的含义解释:

变量说明: $$ Shell本身的PID(ProcessID) $! Shell最后运行的后台Process的PID $? 最后运行的命令的结束代码(返回值) $- 使用Set命令设定的Flag一览 $* 所有参数列表.如"$*"用「"」括起来的情况.以"$1 $2 - $n"的形式输出所有参数. [email protected] 所有参数列表.如"[email protected]"用「"」括起来的情况.以"$1

linux中shell变量$#,[email protected],$*,$?,$$,$!,$_,$0,$1,$2的含义解释

变量说明:    $$    Shell本身的PID(ProcessID)    $!    Shell最后运行的后台Process的PID    $?    最后运行的命令的结束代码(返回值)    $-    使用Set命令设定的Flag一览    $*    所有参数列表.如"$*"用「"」括起来的情况.以"$1 $2 … $n"的形式输出所有参数.    [email protected]    所有参数列表.如"[email prote

makefile 中 [email protected] $^ %< 使用

这篇文章介绍在LINUX下进行C语言编程所需要的基础知识.在这篇文章当中,我们将会学到以下内容: 源程序编译 Makefile的编写 程序库的链接 程序的调试 头文件和系统求助 1.源程序的编译 在Linux下面,如果要编译一个C语言源程序,我们要使用GNU的gcc编译器. 下面我们以一个实例来说明如何使用gcc编译器. 假设我们有下面一个非常简单的源程序(hello.c): int main(int argc,char **argv) { printf("Hello Linux\n"