0

我想用for循环解析我的函数参数

func() {
  for arg in $*; do
    echo "$arg"
  cone
}

如果我所有的论点都没有空格,这很好用

func "111" "222" "333"

但是对于带空格的 args 失败

func "111" "222 222" "333"
4

2 回答 2

2

不要使用$*"$@"而是使用:

for arg in "$@" ; do
     echo "$arg"
done

解释:没有双引号,$*并且$@是相同的。但是,在双引号内,它们是不同的。详见“特殊参数” man bash

* 扩展到位置参数,从一个开始。当扩展出现在双引号内时,它会扩展为单个单词,每个参数的值由 IFS 特殊变量的第一个字符分隔。即, "$*" 等价于"$1c$2c...",其中c是 IFS 变量值的第一个字符。如果未设置 IFS,则参数以空格分隔。如果 IFS 为空,则将参数连接起来而不插入分隔符。

@ 扩展到位置参数,从一个开始。当扩展出现在双引号内时,每个参数都扩展为一个单独的单词。即"$@"等价于"$1" "$2"……如果双引号展开出现在一个词内,则第一个参数的展开与原词的开头部分连接,最后一个参数的展开与最后部分连接的原话。当没有位置参数时,"$@"扩展$@为空(即,它们被删除)。

于 2015-02-16T15:21:56.397 回答
1

将此函数与"$@"而不是 unquoted一起使用$*

func() { for arg in "$@"; do echo "$arg"; done; }

然后将其称为:

func "111" "222 222" "333"
111
222 222
333
于 2015-02-16T15:21:46.597 回答