由于某种原因我无法弄清楚这一点。我需要以下内容看起来像这样。我基本上不想把同一个命令写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
子 shell 中,您可以使用
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
即使任何生产者的值中有空格,这也将允许子 shell 脚本正常工作。
另请注意脚本中对其他扩展的引用,这使得即使制作者或制作者的值中有空格也能正常工作。
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