我想用for
循环
func() {
for arg in $*; do
echo "$arg"
cone
}
如果我的所有参数都没有空格
,这样可以正常工作func "111" "222" "333"
但是对于带空格的args来说它失败了
func "111" "222 222" "333"
答案 0 :(得分:2)
请勿使用$*
,而是使用"$@"
:
for arg in "$@" ; do
echo "$arg"
done
说明:如果没有双引号,$*
和$@
是相同的。但是,在双引号内,它们是不同的。有关详细信息,请参阅man bash
中的“特殊参数”:
*
从1开始扩展到位置参数。当扩展发生在双引号内时,它会扩展为单个单词,每个参数的值由IFS特殊变量的第一个字符分隔。也就是说,"$*"
等同于"$1c$2c..."
,其中c
是IFS变量值的第一个字符。如果未设置IFS,则参数由空格分隔。如果IFS为null,则连接参数时不会插入分隔符。
@
从1开始扩展到位置参数。当扩展发生在双引号内时,每个参数都会扩展为单独的单词。也就是说,"$@"
相当于"$1" "$2"
...如果双引号扩展发生在单词中,则第一个参数的扩展与原始单词的开头部分连接,并且扩展最后一个参数与原始单词的最后一部分连接在一起。如果没有位置参数,"$@"
和$@
会展开为空(即删除它们)。
答案 1 :(得分:1)
将此功能与"$@"
一起使用,而不是使用不带引号的$*
:
func() { for arg in "$@"; do echo "$arg"; done; }
然后将其称为:
func "111" "222 222" "333"
111
222 222
333