何らかの理由で私はこれを見つけることができません。これを見るには、次のものが必要です。基本的に同じコマンドを20〜50回以上作成したくありません。ありがとうございます!
以下の現在のループの問題は、コマンド文字列内の変数$ {NETWORKNAME,,}が空の文字列を返すことです。はい
docker exec cli.Amazon bash -c 'peer channel create -c asus -f ./channels/Asus.tx -o orderer..com:7050'
これは明らかに正しいコマンドではありません
私が探しているものは何ですか?
docker exec cli.Amazon bash -c 'peer channel create -c asus -f ./channels/Asus.tx -o orderer.pcexchange.com:7050'
現在のコード
#!/bin/bash
NETWORKNAME=PCEXCHANGE
VERSION=1.1.0
ORGANIZATIONS=( "Asus" "Dell" "HP" "Amazon" )
PRODUCERS=( "Asus" "Dell" "HP" )
MAKERS=( "Amazon" )
for org in ${PRODUCERS[@]}
do
for maker in ${MAKERS[@]}
do
docker exec cli.${maker} bash -c 'peer channel create -c ${org,,} -f ./channels/${org}.tx -o orderer.${NETWORKNAME,,}.com:7050'
done
done
答え1
変数をサブシェルに安全に渡すには、bash -c
次のようにします。
bash -c 'script goes here' bash "arg1" "arg2" "arg3" ...
それは、
#!/bin/bash
NETWORKNAME=PCEXCHANGE
VERSION=1.1.0
ORGANIZATIONS=( "Asus" "Dell" "HP" "Amazon" )
PRODUCERS=( "Asus" "Dell" "HP" )
MAKERS=( "Amazon" )
for org in "${PRODUCERS[@]}"; do
for maker in "${MAKERS[@]}"; do
docker exec "cli.$maker" \
bash -c 'peer channel create -c "$1" -f "$2" -o "$3"' bash \
"${org,,}" "./channels/$org.tx" "orderer.${NETWORKNAME,,}.com:7050"
done
done
これにより、プロデューサ値にスペースが含まれていても、サブシェルスクリプトが正しく機能するようになります。
また、スクリプトの他の拡張機能への参照も参照してください。これにより、生産者または生産者の値にスペースが含まれていても機能します。
bash
スクリプト自体のテキストに続くパラメータはbash -c
に渡されます$0
。これは通常スクリプトまたはインタプリタの名前なので、文字列として渡すだけですbash
。
答え2
一重引用符の代わりに二重引用符を使用する必要があります。一重引用符は、変数拡張が発生するのを防ぎます。この試み:
#!/bin/bash
NETWORKNAME=PCEXCHANGE
VERSION=1.1.0
ORGANIZATIONS=( "Asus" "Dell" "HP" "Amazon" )
PRODUCERS=( "Asus" "Dell" "HP" )
MAKERS=( "Amazon" )
for org in ${PRODUCERS[@]}
do
for maker in ${MAKERS[@]}
do
docker exec cli.${maker} bash -c "peer channel create -c ${org,,} -f ./channels/${org}.tx -o orderer.${NETWORKNAME,,}.com:7050"
done
done