Bash 如何获得支架扩展的备用分隔符?
我发现自己经常做一些愚蠢的事情,比如:Bash 如何获得支架扩展的备用分隔符?,bash,Bash,我发现自己经常做一些愚蠢的事情,比如: cmd $( echo foo{1,2,3} | tr ' ' , ) 当我想调用cmd foo1、foo2、foo3时。相反,我希望能够做到以下几点: OFS=;cmd foo{1,2,3} 强制大括号展开以给我一个逗号分隔的列表。有这样的功能吗?我认为用一个简单的变量或设置是不可能的 但是,您可以捕获阵列中的大括号展开,然后使用IFS和参数替换来实现该效果: $ ( a=( foo{1,2,3} ); IFS=,; printf -- "%s\n"
cmd $( echo foo{1,2,3} | tr ' ' , )
当我想调用cmd foo1、foo2、foo3
时。相反,我希望能够做到以下几点:
OFS=;cmd foo{1,2,3}
强制大括号展开以给我一个逗号分隔的列表。有这样的功能吗?我认为用一个简单的变量或设置是不可能的 但是,您可以捕获阵列中的大括号展开,然后使用IFS和参数替换来实现该效果:
$ ( a=( foo{1,2,3} ); IFS=,; printf -- "%s\n" "${a[*]}" )
foo1,foo2,foo3
在这里,我使用了一个子shell,所以我不会改变当前shell中的IFS
这是一个简短的例子 更整洁的功能:
$ join() { local IFS=$1; shift; printf -- "%s\n" "$*"; }
$ join , foo{1,2,3}
foo1,foo2,foo3
您可以创建一个函数,该函数将回显其参数的逗号分隔列表:
commas() { local IFS=,; echo "$*"; }
然后您可以在调用cmd
时使用它:
cmd "$(commas foo{1,2,3})"
编辑:请注意,echo
有些错误,因为如果您传递一个看起来像有效的echo
选项的参数(例如,-e
,-n
,等等),echo
将使用它并将其解释为选项,而不是打印它
$ commas -e #prints nothing
$ commas -n #prints nothing
$ commas -e -n
-e,-n
最后一个有效,因为“$*”
扩展为-e,-n
,而echo
将其视为单个参数
而
echo
不像printf
那样,将--
参数作为“选项结束”指示符。因此,您可能希望使用printf--“%s\n”$*“
,如@glennjackman的答案所示。同样,commas
函数的全部要点是将多个参数组合成一个逗号分隔的列表,作为一个字符串。因此,您不太可能在echo
中遇到任何问题。但是,键入printf--“%s”
而不是echo
只需多输入几个字符,如果cmd
总是相同的话,函数可能会有所帮助。有趣的是,大括号扩展和路径名扩展(大括号扩展与之相比)的文档实际上都没有说明结果是什么。它只是一个单词的“列表”,据我所知,最接近的是数组的笨拙使用cmd“$(IFS=,;x=(foo{1,2,3});printf'%s'${x[*]}”)”
。无引号的命令替换可能会导致问题,具体取决于commas
的参数最终是什么。谢谢。@chepner发现得很好。谢谢