word splitting(分词)

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

$ echo a   b  c      da b c d

shell 将 $IFS 的每个字符作为分隔符,如果 $IFS 是 unset 的,则有默认值 <space><tab><newline>

分词的时候,首先疏忽变量首位的空白符 <space><tab><newline>,再分隔失去单词。

判断 $IFS 是否 unset 的办法。

// 文件test#!/usr/bin/bashif [ -v IFS ];then  echo ==\$IFS=$IFS==else  echo ==\$IFS is unset==fi$ ./test==$IFS= ==

for 循环中的 $* 与 $@

$*$@ 都能示意所有的地位参数。

  • 未在双引号中:二者用法统一,都会进行分词。

    // 文件test#!/usr/bin/bashecho '==$*=='for name in $*doecho $namedoneecho '==$@=='for name in $@doecho $namedone$ ./test a  s  d fff==$*==asdfff==$@==asdfff
  • 在双引号中:

$* 会先分词,再以 $IFS 的第一个字符为分隔符,合并成一个字符串; "$*" 相当于 "$1c$2c…"c 示意 $IFS 的第一个字符。

$@ 也会分词,但不会合并成一个字符串;
"$@" 相当于 "$1" "$2"…,跟不加双引号其甩出是一样的。

// 文件test#!/usr/bin/bashecho '==$*=='for name in "$*"do  echo $namedoneecho '==$@=='for name in "$@"do  echo $namedone$ ./test a  s  d fff==$*==a s d fff==$@==asdfff

参考

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