将变量传递给 shell 文件中的字符串

将变量传递给 shell 文件中的字符串

由于某种原因我无法弄清楚这一点。我需要以下内容看起来像这样。我基本上不想把同一个命令写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

相关内容