如何正确打印作为参数传递给Bash函数的字符串?

时间:2017-07-24 03:33:03

标签: linux bash shell

我正在写这样的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全部在一行。

如何解决这个问题?谢谢〜

2 个答案:

答案 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正确使用$*$@以及两者之间的差异。