bash(for 循环与位置参数( $*、$@))

word splitting(分词) 如果没有在双引号中,变量在进行参数扩展、命令替换和算术扩展之后,shell 会对变量进行分词,比如:

$ echo abcd a b c d

shell 将 $IFS 的每个字符作为分隔符,如果 $IFS 是 unset 的,则有默认值
分词的时候,首先忽略变量首位的空白符 ,再分隔得到单词。
判断 $IFS 是否 unset 的方法。
// 文件test #!/usr/bin/bash if [ -v IFS ]; then echo ==\$IFS=$IFS== else echo ==\$IFS is unset== fi$ ./test ==$IFS= ==

for 循环中的 $* 与 $@ $*$@ 都能表示所有的位置参数。
  • 未在双引号中:二者用法一致,都会进行分词。
    // 文件test #!/usr/bin/bash echo '==$*==' for name in $* do echo $name doneecho '==$@==' for name in $@ do echo $name done$ ./test asd fff ==$*== a s d fff ==$@== a s d fff

  • 在双引号中:
$* 会先分词,再以 $IFS 的第一个字符为分隔符,合并成一个字符串; "$*" 相当于 "$1c$2c…"c 表示 $IFS 的第一个字符。
【bash(for 循环与位置参数( $*、$@))】$@ 也会分词,但不会合并成一个字符串;
"$@" 相当于 "$1" "$2"…,跟不加双引号其甩出是一样的。
// 文件test #!/usr/bin/bash echo '==$*==' for name in "$*" do echo $name doneecho '==$@==' for name in "$@" do echo $name done$ ./test asd fff ==$*== a s d fff ==$@== a s d fff

参考
  • Bash Reference Manual:https://www.gnu.org/software/...

    推荐阅读