我想用for
循环解析我的函数参数
func() {
for arg in $*; do
echo "$arg"
cone
}
如果我所有的论点都没有空格,这很好用
func "111" "222" "333"
但是对于带空格的 args 失败
func "111" "222 222" "333"
不要使用$*
,"$@"
而是使用:
for arg in "$@" ; do
echo "$arg"
done
解释:没有双引号,$*
并且$@
是相同的。但是,在双引号内,它们是不同的。详见“特殊参数” man bash
:
*
扩展到位置参数,从一个开始。当扩展出现在双引号内时,它会扩展为单个单词,每个参数的值由 IFS 特殊变量的第一个字符分隔。即,"$*"
等价于"$1c$2c..."
,其中c
是 IFS 变量值的第一个字符。如果未设置 IFS,则参数以空格分隔。如果 IFS 为空,则将参数连接起来而不插入分隔符。
@
扩展到位置参数,从一个开始。当扩展出现在双引号内时,每个参数都扩展为一个单独的单词。即"$@"
等价于"$1" "$2"
……如果双引号展开出现在一个词内,则第一个参数的展开与原词的开头部分连接,最后一个参数的展开与最后部分连接的原话。当没有位置参数时,"$@"
扩展$@
为空(即,它们被删除)。
将此函数与"$@"
而不是 unquoted一起使用$*
:
func() { for arg in "$@"; do echo "$arg"; done; }
然后将其称为:
func "111" "222 222" "333"
111
222 222
333