bash - 带 $@ 参数的大括号扩展

标签 bash variable-expansion brace-expansion

假设我用 3 个参数调用脚本,aabcxyz 这样 $@包含这三个参数。

假设我想调用写一个命令:

command fooa fooabc fooxyz bara barabc barxyz

我将如何实现?

我认为 {foo,bar}$@{foo,bar}{$@} 行不通,因为大括号扩展发生在 $@ 之前 展开。

最佳答案

您可以使用:

command "${@/#/foo}" "${@/#/bar}"

这使用 shell parameter expansion 的替代变体。 # 将匹配锚定到参数的开头。

$ set -- a abc xyz
$ echo command "${@/#/foo}" "${@/#/bar}"
command fooa fooabc fooxyz bara barabc barxyz
$

Is there a way to scale this for larger {foo,bar,baz,...}$@ or {foo,bar}{123,456}$@?

是的,但你最终会使用数组:

$ set -- a abc xyz
$ args=( "$@" )
$ for prefix in foo bar baz who why; do prefixed1+=( "${args[@]/#/$prefix}" ); done
$ echo command "${prefixed1[@]}"
command fooa fooabc fooxyz bara barabc barxyz baza bazabc bazxyz whoa whoabc whoxyz whya whyabc whyxyz
$

或者(注意您必须正确排序):

$ for prefix in 123 456; do prefixed1+=( "${args[@]/#/$prefix}" ); done
$ for prefix in foo bar; do prefixed2+=( "${prefixed1[@]/#/$prefix}" ); done
$ echo command "${prefixed2[@]}"
command foo123a foo123abc foo123xyz foo456a foo456abc foo456xyz bar123a bar123abc bar123xyz bar456a bar456abc bar456xyz
$

请注意,这会保留参数中的空格:

$ unset prefixed1 prefixed2
$ set -- 'a b' 'x y z'
$ args=( "$@" )
$ for prefix in 'p p-' '123 456 '; do prefixed1+=( "${args[@]/#/$prefix}" ); done
$ echo command "${prefixed1[@]}"
command p p-a b p p-x y z 123 456 a b 123 456 x y z
$ for prefix in 'foo 1-' 'bar 2-'; do prefixed2+=( "${prefixed1[@]/#/$prefix}" ); done
$ echo command "${prefixed2[@]}"
command foo 1-p p-a b foo 1-p p-x y z foo 1-123 456 a b foo 1-123 456 x y z bar 2-p p-a b bar 2-p p-x y z bar 2-123 456 a b bar 2-123 456 x y z
$ printf "[%s]\n" "${prefixed2[@]}"
[foo 1-p p-a b]
[foo 1-p p-x y z]
[foo 1-123 456 a b]
[foo 1-123 456 x y z]
[bar 2-p p-a b]
[bar 2-p p-x y z]
[bar 2-123 456 a b]
[bar 2-123 456 x y z]
$

第一个循环可以是:

for prefix in 'p p-' '123 456 '; do prefixed1+=( "${@/#/$prefix}" ); done

不使用 ${args[@]} 数组。

关于bash - 带 $@ 参数的大括号扩展,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36072928/

相关文章:

objective-c - 从 cocoa (obj.c) 执行 shell 脚本并响应

bash - 如何只处理一列并在 BASH 中转换文本文件中的 unix 时间

linux - 分隔符”、空格和 Linux 中的 bash 脚本

bash - 我们什么时候需要用大括号括住 shell 变量?

powershell - 扩展通过 Powershell 中的单引号存储的字符串变量

bash - 如何在脚本中触发大括号扩展?

bash - 使用命令管道作为 diff 的参数

bash - 带变量的括号扩展?

c - 带系统函数的 C 程序中的大括号扩展

bash - 如何在 wget 请求中显示缺少前导 0?