LinuxEye - Linux系统教程

LinuxEye - Linux系统教程

当前位置: 主页 > 脚本编程 >

shell中的$*和$@的区别

时间:2013-07-07 14:28来源:未知 编辑:linuxeye 点击:
Bash脚本中,$*和$@都用于表示执行脚本时所传入的参数。先通过一个例子看看他们的区别: #!/bin/bashecho -------------ISF is set to \-seperator\ ------------IFS=-seperator; # 注意 seperator前有一个减号(-)
Bash脚本中,$*和$@都用于表示执行脚本时所传入的参数。先通过一个例子看看他们的区别:
#!/bin/bash
echo "-------------ISF is set to \"-seperator\" ------------"
IFS="-seperator";  # 注意 seperator前有一个减号(-)
for i in "$@"; do echo "@ '$i'"; done
for i in "$*"; do echo "* '$i'"; done

echo "-------------ISF is set to null ------------------------"
IFS=
for i in "$@"; do echo "@ '$i'"; done
for i in "$*"; do echo "* '$i'"; done

echo "-------------ISF is unset ------------------------"
unset IFS
for i in "$@"; do echo "@ '$i'"; done
for i in "$*"; do echo "* '$i'"; done


echo "---------$* and $@ are not put into double quotes(\"\")-------"
for i in $@; do echo "@ '$i'"; done
for i in $*; do echo "* '$i'"; done
 执行的结果如下:
# sh testvar.sh 11 22 33
-------------ISF is set to "-seperator" ------------
@ '11'
@ '22'
@ '33'
* '11-22-33'
-------------ISF is set to null ------------------------
@ '11'
@ '22'
@ '33'
* '112233'
-------------ISF is unset ------------------------
@ '11'
@ '22'
@ '33'
* '11 22 33'
---------11 22 33 and 11 22 33 are not put into double quotes("")-------
@ '11'
@ '22'
@ '33'
* '11'
* '22'
* '33'
  • 当不加双引号("")时, $*,$@被展开时的行为是一样的;
  • 当$*,$@都被放到双引号("")内;
    • 如果设置了变量IFS的值并且该值非空, 则$*被展开时使用${IFS}的第一个字符将所有参数(除了参数$0)连接起来, 即"$1c$2c$3c...",其中c表示${IFS}的第一个字符;
    • 如果变量IFS为空, 则$*被展开时只是将所有参数(除了参数$0)简单连接起来, 即 “$1$2$3..."
    • 如果变量IFS没有被定义, 则$*被展开时使用空格字符将所有参数(除了参数$0) 连接起来, 即"$1 $2 $3 ..."
但$@的展开和没有加双引号的情形是一致的。

转载请保留固定链接: https://linuxeye.com/program/1812.html

------分隔线----------------------------
标签:shell$*$@
栏目列表
推荐内容