Passar variável para uma string em um arquivo shell

0

Eu, por algum motivo, não consigo entender isso. Eu preciso do seguinte para se parecer com isso. Eu basicamente não quero escrever o mesmo comando 20-50 vezes dependendo ou até mais. Obrigado!

O problema com o loop atual abaixo é que o vars $ {NETWORKNAME ,} dentro da string no comando retorna uma string vazia. Exemplo

docker exec cli.Amazon bash -c 'peer channel create -c asus -f ./channels/Asus.tx -o orderer..com:7050'

O que obviamente não é um comando correto

O que estou procurando

docker exec cli.Amazon bash -c 'peer channel create -c asus -f ./channels/Asus.tx -o orderer.pcexchange.com:7050'

Código atual

#!/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
    
por 0xSEGFAULT 14.05.2018 / 21:34

2 respostas

0

Você precisa usar aspas duplas em vez de aspas simples - as aspas simples impedem que a expansão das variáveis ocorra. Tente isso:

#!/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
    
por 14.05.2018 / 21:47
3

Para passar variáveis com segurança para um shell filho bash -c , você usaria

bash -c 'script goes here' bash "arg1" "arg2" "arg3" ...

Isto é,

#!/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

Isso permitiria que o script de shell filho funcionasse mesmo se qualquer um dos produtores tivesse espaços em seus valores.

Observe também a citação das outras expansões no script, o que faz com que funcione mesmo quando produtores ou fabricantes têm espaços em seus valores.

O argumento bash após o texto do script bash -c em si é o que é passado para $0 . Este é geralmente o nome do script ou do interpretador, então simplesmente passamos a string bash .

    
por 14.05.2018 / 22:31