In Bash, php/{composer,sismo}
erweitert auf php/composer php/sismo
. Gibt es eine Möglichkeit, dies mit /bin/sh
(was ich glaube, Strich ist), die System Shell? Ich schreibe git hooks und would like to stay away from bash as long as I can.Strich entspricht der geschweiften Klammern-Syntax von Bash?
Antwort
Sie können printf
verwenden.
% printf 'str1%s\t' 'str2' 'str3' 'str4'
str1str2 str1str3 str1str4
Es scheint keinen Weg zu geben. Sie müssen Schleifen verwenden, um diese Namen zu erzeugen, vielleicht in einer Funktion. Oder verwenden Sie Variablen, um allgemeine Teile zu ersetzen, vielleicht mit "set -u", um Tippfehler zu vermeiden.
Ich sehe, dass Sie Dash aus Leistungsgründen bevorzugen, aber Sie scheinen keine Zahlen zur Verfügung zu stellen, um Ihre Entscheidung zu begründen. Ich würde vorschlagen, dass Sie den tatsächlichen Leistungsunterschied messen und neu bewerten. Sie könnten auch für vorzeitige Optimierung fallen. Berücksichtigen Sie, wie viel Zeit für die Implementierung und das Debugging Sie bei der Verwendung von Bash im Vergleich zu möglichen Leistungseinbußen sparen.
Ich mag die printf
Lösung von @mikeserv zur Verfügung gestellt, aber ich dachte, dass ich ein Beispiel nennen würde eine Schleife verwenden.
Das Folgende wäre wahrscheinlich am nützlichsten, wenn Sie einen Befehl für jede erweiterte Zeichenfolge ausführen möchten, anstatt beide Zeichenfolgen als Argumente für denselben Befehl bereitzustellen.
for X in composer sismo; do
echo "php/$X" # replace 'echo' with your command
done
Sie könnten jedoch umschreiben es als
ARGS="$(for X in composer sismo; do echo "php/$X"; done)"
echo $ARGS # replace 'echo' with your command
Beachten Sie, dass $ARGS
in dem obigen Befehl unquoted ist, und sich bewusst sein, dass dies bedeutet, dass sein Inhalt wordsplitted (dh wenn irgendwelche Ihrer Original-Zeichenketten Leerzeichen enthalten, wird es brechen).
Ich denke, es ist in der Tat vorzeitige Optimierung, ich war mir nicht sicher, weil ich nicht so viel Shell-Skripte schreiben. Ich merke, dass sie nichts kompliziertes tun, so dass der Unterschied nur Startup-Zeit bash ... – greg0ire
@ greg0ire, ja, meist die Startzeit, aber es kann immer noch wichtig für Ihren Fall, wenn Sie viele Skriptaufrufe benötigen, oder viele verwenden Sub-Shells in Ihrem Code. Wenn die Leistung für Sie wichtig ist, messen Sie sie für ein typisches Szenario. – spbnick
Zeit gibt mir einen Unterschied fallen: bash = 5ms, sh = 3ms. Ich denke aber, dass es akzeptabel ist. – greg0ire