Shell 根據字串清單產生命令參數

Shell 根據字串清單產生命令參數

我最近遇到了以下 docker 命令,它是如此冗長,

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

有沒有辦法透過減少重複來縮短它?

例如,有多個-v參數可以表示為以下形式:

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

是否有任何緊湊的方法可以在 bash 或 zsh 中執行此操作(以類似於 shell 擴展的方式,無需編寫另一行)?

答案1

你試試這個:

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

答案2

這應該適用於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

這使用 POSIX%$1s參數索引printf在輸出中多次包含相同的參數(範例中的 config、local、certs)。顯然bash還不支持這一點。

續行符 ( \) 只是為了使其更具可讀性;它仍然可以透過單一操作進行複製和貼上。

相關內容