シェルファイルの文字列に変数を渡す

シェルファイルの文字列に変数を渡す

何らかの理由で私はこれを見つけることができません。これを見るには、次のものが必要です。基本的に同じコマンドを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

関連情報