7

在 bash 中,php/{composer,sismo}扩展为php/composer php/sismo. 有没有办法用/bin/sh系统外壳(我相信是破折号)来做到这一点?我正在编写git hooks并且希望尽可能远离 bash

4

3 回答 3

7

您可以使用printf.

% printf 'str1%s\t' 'str2' 'str3' 'str4'
str1str2    str1str3    str1str4
于 2013-12-07T13:38:19.253 回答
4

好像没有办法。您将不得不使用循环来生成这些名称,也许在一个函数中。或者使用变量来替换公共部分,可能使用“set -u”来防止拼写错误。

我看到您出于性能原因更喜欢 dash,但是您似乎没有提供任何数字来证实您的决定。我建议您测量实际的性能差异并重新评估。您也可能会陷入过早的优化。考虑一下使用 Bash 将节省多少实现和调试时间与可能的性能下降。

于 2013-07-23T10:02:14.843 回答
0

我真的很喜欢printf@mikeserv 提供的解决方案,但我想我会提供一个使用循环的示例。

如果您希望为每个扩展字符串执行一个命令,而不是将两个字符串作为 args 提供给同一命令,则以下内容可能最有用。

for X in composer sismo; do
    echo "php/$X"                   # replace 'echo' with your command
done

但是,您可以将其重写为

ARGS="$(for X in composer sismo; do echo "php/$X"; done)"
echo $ARGS                          # replace 'echo' with your command

请注意,$ARGS在上面的命令中没有引用,并注意这意味着它的内容是分词的(即,如果您的任何原始字符串包含空格,它将中断)。

于 2014-07-21T14:51:49.280 回答