这是一个示例函数:
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只是想打印参数,但他们可能想将括号内的参数传递给其他命令比echo
或printf
。
shell 没有mapcar
, etc[1] 所以唯一的方法是一个简单的循环(cmd
用实际命令替换占位符):
function example { for arg; do cmd "TextBefore $arg TextAfter"; done; }
作为旁注,在原始 中echo "TextBefore $@ TextAfter"
,当调用$@
设置为 a A1B
, A2B
, ...,时A5B
,单独的参数传递给echo
will TextBefore A1B
, A2B
, ..., A5B TextAfter
。这是一种使用$@
几乎没有意义的情况。
[1] 确实如此,但在如此简单的情况下,不值得费力xargs
地克服陷阱和缺点。xargs