若是没有在双引号中,变量在进行参数扩展、命令替换和算术扩展以后,shell 会对变量进行分词,好比:html
$ echo a b c d a b c d
shell 将 $IFS
的每一个字符做为分隔符,若是 $IFS
是 unset 的,则有默认值 <space><tab><newline>
。shell
分词的时候,首先忽略变量首位的空白符 <space><tab><newline>
,再分隔获得单词。bash
判断 $IFS
是否 unset 的方法。spa
// 文件test #!/usr/bin/bash if [ -v IFS ];then echo ==\$IFS=$IFS== else echo ==\$IFS is unset== fi $ ./test ==$IFS= ==
$*
与 $@
都能表示全部的位置参数。code
未在双引号中:两者用法一致,都会进行分词。htm
// 文件test #!/usr/bin/bash echo '==$*==' for name in $* do echo $name done echo '==$@==' for name in $@ do echo $name done $ ./test a s d fff ==$*== a s d fff ==$@== a s d fff
$*
会先分词,再以 $IFS
的第一个字符为分隔符,合并成一个字符串; "$*"
至关于 "$1c$2c…"
,c
表示 $IFS
的第一个字符。字符串
$@
也会分词,但不会合并成一个字符串;"$@"
至关于 "$1" "$2"…
,跟不加双引号其甩出是同样的。get
// 文件test #!/usr/bin/bash echo '==$*==' for name in "$*" do echo $name done echo '==$@==' for name in "$@" do echo $name done $ ./test a s d fff ==$*== a s d fff ==$@== a s d fff