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

word splitting(分词)

若是没有在双引号中,变量在进行参数扩展、命令替换和算术扩展以后,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= ==

for 循环中的 $* 与 $@

$*$@ 都能表示全部的位置参数。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

参考

相关文章
相关标签/搜索