Bash函数:执行$@命令,每个参数按顺序单独执行

Bash函数:执行$@命令,每个参数按顺序单独执行

这是一个示例函数:

function example { echo "TextBefore $@ TextAfter" ; }

这是使用该函数的命令:

example A{1..5}B

输出:

TextBefore A1B A2B A3B A4B A5B TextAfter

我希望它是怎样的:

TextBefore A1B TextAfter
TextBefore A2B TextAfter
TextBefore A3B TextAfter
TextBefore A4B TextAfter
TextBefore A5B TextAfter

这是我所能描述的最好的了。如果您理解它并且知道更好的描述方式,请编辑问题。

如何使序列中的每个[在此处插入单词]单独执行,如该示例所示?

答案1

尝试这个:

function example { printf 'TextBefore %s TextAfter\n' "$@"; }

答案2

使用printf而不是echo.该printf实用程序将格式字符串作为其第一个参数(可以总是是单引号字符串),并且该字符串将包含其他参数的占位符:

printf 'TextBefore %s TextAfter\n' "$@"

中的参数"$@"将被插入到 给出的位置%s。由于格式字符串中只有一个%s占位符,因此格式字符串将依次为每个参数重用。这与printf其他语言的工作方式不同。

请注意,printf默认情况下不输出终止换行符。

例子:

$ printf 'AAA %s BBB\n' 1 2 3 4 5
AAA 1 BBB
AAA 2 BBB
AAA 3 BBB
AAA 4 BBB
AAA 5 BBB

如果格式化字符串中有更多占位符,这些占位符将由给定的参数依次填充printf。如果仍有更多可用参数,则在填充所有占位符后,将重用格式化字符串。

$ printf 'AAA %s %03d BBB\n' 1 2 3 4 5
AAA 1 002 BBB
AAA 3 004 BBB
AAA 5 000 BBB

因此你的函数可能看起来像

example () {
    [ "$#" -gt 0 ] && printf 'TextBefore %s TextAfter\n' "$@"
}

也可以看看:

答案3

虽然两个答案都假设OP只是想打印参数,但他们可能想将括号内的参数传递给其他命令echoprintf

shell 没有mapcar, etc[1] 所以唯一的方法是一个简单的循环(cmd用实际命令替换占位符):

function example { for arg; do cmd "TextBefore $arg TextAfter"; done; }

作为旁注,在原始 中echo "TextBefore $@ TextAfter",当调用$@设置为 a A1B, A2B, ...,时A5B,单独的参数传递给echowill TextBefore A1B, A2B, ..., A5B TextAfter。这是一种使用$@几乎没有意义的情况。

[1] 确实如此,但在如此简单的情况下,不值得费力xargs地克服陷阱和缺点。xargs

相关内容