两者都代表bash命令行参数,在没有用双引号括起来的时候,两者效果一样
但是两者若被双引号括起来,就有不同了
$*会显示出参数见的分隔符,而$@则不会。这是因为前者被解读为一个整体字符串,而后在解读为一个个分开的字符串
参考文献:http://bash.cyberciti.biz/guide/$IFS
IFS Effect On The Values of "$@" And "$*"
- $@ and $* are special command line arguments shell variables.
- The $@ holds list of all arguments passed to the script.
- The $* holds list of all arguments passed to the script.
- Create a shell script called ifsargs.sh:
#!/bin/bash # ifsargs.sh - Cmd args - positional parameter demo echo "Command-Line Arguments Demo" echo "*** All args displayed using \$@ positional parameter ***" echo $@ echo "*** All args displayed using \$* positional parameter ***" echo $*
Save and close the file. Run it as follows:
chmod +x ifsargs.sh ./ifsargs.sh honda yamaha harley-davidson kawasaki
Sample outputs:
Command-Line Arguments Demo *** All args displayed using $@ positional parameter *** honda yamaha harley-davidson kawasaki *** All args displayed using $* positional parameter *** honda yamaha harley-davidson kawasaki
- As you can see, the values of $@ and $* are same.
- However, the values of "$@" and "$*" are different (note double quotes).
- Edit ifsargs.sh as follows
#!/bin/bash # ifsargs.sh - Cmd args - positional parameter demo #### Set the IFS to | #### IFS='|' echo "Command-Line Arguments Demo" echo "*** All args displayed using \$@ positional parameter ***" echo "$@" #*** double quote added ***# echo "*** All args displayed using \$* positional parameter ***" echo "$*" #*** double quote added ***#
Save and close the file. Run it as follows:
./ifsargs.sh honda yamaha harley-davidson kawasaki
Sample outputs:
Command-Line Arguments Demo *** All args displayed using $@ positional parameter *** honda yamaha harley-davidson kawasaki *** All args displayed using $* positional parameter *** honda|yamaha|harley-davidson|kawasaki
- $@ expanded as "$1" "$2" "$3" ... "$n"
- $* expanded as "$1y$2y$3y...$n", where y is the value of IFS variable i.e. "$*" is one long string and $IFS act as an separator or token delimiters.