쉘 파일의 문자열에 변수 전달

쉘 파일의 문자열에 변수 전달

어떤 이유로 나는 이것을 알아낼 수 없습니다. 이렇게 보이려면 다음이 필요합니다. 기본적으로 동일한 명령을 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. 이는 일반적으로 스크립트나 인터프리터의 이름이므로 string 으로 전달하면 됩니다 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

관련 정보