Shell generiert Befehlsargumente basierend auf einer Liste von Zeichenfolgen

Shell generiert Befehlsargumente basierend auf einer Liste von Zeichenfolgen

Ich bin kürzlich auf den folgenden Docker-Befehl gestoßen, der so lang ist,

docker run -it -v $PWD/config:/opt/ibm/datapower/drouter/config -v $PWD/local:/opt/ibm/datapower/drouter/local -v $PWD/certs:/opt/ibm/datapower/root/secure/certs -e DATAPOWER_ACCEPT_LICENSE=true -e DATAPOWER_INTERACTIVE=true -p 9090:9090 -p 9022:22 -p 5554:5554 -p 8000-8010:8000-8010 --name idg ibmcom/datapower

Gibt es eine Möglichkeit, es durch Reduzierung der Wiederholungen zu verkürzen?

Beispielsweise gibt es mehrere -vArgumente, die wie folgt ausgedrückt werden könnten:

for each string in ['config', 'local', 'certs']:
    -v $PWD/$$string:/opt/ibm/datapower/drouter/$$string

Gibt es eine kompakte Möglichkeit, dies in Bash oder Zsh zu tun (auf eine Weise ähnlich der Shell-Erweiterung, ohne eine weitere Zeile zu schreiben)?

Antwort1

Versuchen Sie Folgendes:

docker run -it $(for d in config local certs; do echo -n "-v $PWD/$d:/opt/ibm/datapower/drouter/$d "; done) -e DATAPOWER_ACCEPT_LICENSE=true -e DATAPOWER_INTERACTIVE=true -p 9090:9090 -p 9022:22 -p 5554:5554 -p 8000-8010:8000-8010 --name idg ibmcom/datapower

Antwort2

Dies sollte in folgenden Fällen funktionieren zsh:

docker run -it \
  $(printf -- "-v $PWD/%1\$s:/opt/ibm/datapower/drouter/%1\$s " config local certs)\
  -e DATAPOWER_ACCEPT_LICENSE=true -e DATAPOWER_INTERACTIVE=true \
  -p 9090:9090 -p 9022:22 -p 5554:5554  -p 8000-8010:8000-8010 \
  --name idg ibmcom/datapower

Dies verwendet die POSIX %$1s-Argumentindizierung, printfum denselben Parameter mehrfach in die Ausgabe einzuschließen (in Ihrem Beispiel „config“, „local“, „certs“). bashDies wird anscheinend (noch) nicht unterstützt.

Die Zeilenfortsetzungen ( \) dienen lediglich der besseren Lesbarkeit; das Kopieren und Einfügen in einem einzigen Vorgang ist weiterhin möglich.

verwandte Informationen