我正在写这样的shell(bash)脚本:
output_function()
{
for i in "$@"
do
echo $i
done
}
process_funtion()
{
string=process some thing
output_function $string
}
例如,在处理了一些东西后,字符串是
i am line 1
i am line 2
我想按原样打印这两行,但实际上我得到了
i
am
line
1
i
am
line
2
这也不起作用:
#!/bin/bash
output()
{
printf '%s\n' "$@"
}
output `ifconfig`
结果是:
...
2000
inet6
fe80::6de5:743c:addd:7c5a%utun0
prefixlen
64
scopeid
0xa
nd6
options=201<PERFORMNUD,DAD>
这也不起作用:
#!/bin/bash
output()
{
printf '%s\n' "$*"
}
output `ifconfig`
resutl全部在一行。
如何解决这个问题?谢谢〜
答案 0 :(得分:2)
您需要将函数参数括在双引号中以防止word splitting:
output "$string"
而不是
output $string
你真的不需要循环来打印$@
的内容,你可以简单地写一下:
printf '%s\n' "$@"
另见:
答案 1 :(得分:1)
在你的例子中:
output()
{
printf '%s\n' "$*"
}
output `ifconfig`
ifconfig的结果也需要引用,否则在传递给函数之前,结果将被拆分为多个参数(使用$ IFS)。所以
output "`ifconfig`"
应该这样做。
请参阅Bash Reference Manual: 3.4.2 Special Parameters正确使用$*
和$@
以及两者之间的差异。