Obtenha o valor do argumento passado para o script importando variáveis ​​de outro script

Obtenha o valor do argumento passado para o script importando variáveis ​​de outro script

Estou tentando exportar variáveis ​​de um script para o script principal e passar uma das variáveis ​​importadas como argumento para o script principal.

Aqui está o script fruitcolour.shcontendo apenas variáveis:

apple="Red"
mango="Yellow"
orange="Orange"
pear="Green"

Aqui está o script principal GetFruitColour.sh:

#!/bin/bash

source fruitcolour.sh

echo "The colour of " $@ " is " $@ "."

Para passar applecomo argumento, quero obter o valor da variável, appleou seja Red.

Então, quando eu corro./GetFruitColour.sh apple

Deve dar saída ::The colour of apple is Red.

Responder1

Uma maneira de conseguir isso é através da indireção – referindo-se a outra variável a partir do valor da primeira variável.

Para demonstrar:

apple="Red"
var="apple"
echo "${!var}"

Resulta em:

Red

Porque bash primeiro significa !varo valor da varvariável, que é então interpretado via ${apple}e transformado em Red.

Como resultado, seu script GetFruitColour.sh poderia ser semelhante a:

#!/bin/bash

source ./fruitcolour.sh

for arg in "$@"
do
  printf 'The colour of %s is %s.\n' "$arg" "${!arg}"
done

Tornei o caminho para o script de origem relativo em vez de vazio, para deixar mais claro onde o arquivo está (se o nome do arquivo fornecido não contiver uma barra, os shells pesquisarão a $PATHvariável por ele, o que pode surpreendê-lo).

Eu tambémalterado echoparaprintf.

A mudança funcional é usar a variável de loop $arge a expansão indireta dela para produzir os valores desejados:

$ ./GetFruitColour.sh apple mango
The colour of apple is Red.
The colour of mango is Yellow.

Observe que não há verificação de erros aqui:

$ ./GetFruitColour.sh foo
The colour of foo is .

Você pode achar mais fácil usar um array associativo:

declare -A fruits='([orange]="Orange" [apple]="Red" [mango]="Yellow" [pear]="Green" )'

for arg in "$@"
do
  if [ "${fruits["$arg"]-unset}" = "unset" ]
  then
    echo "I do not know the color of $arg"
  else
    printf 'The colour of %s is %s.\n' "$arg" "${fruits["$arg"]}"
  fi
done

Responder2

Você precisa usar uma referência indireta de variável:

Se o primeiro caractere do parâmetro for um ponto de exclamação (!), e o parâmetro não for um nameref, ele introduzirá um nível de indireção. Bash usa o valor formado pela expansão do restante do parâmetro como o novo parâmetro; isso é então expandido e esse valor é usado no restante da expansão, em vez da expansão do parâmetro original. Isso é conhecido como expansão indireta.

frutacolor.sh:

#!/bin/bash

source fruitcolor.sh

echo "The color of $1 is ${!1}"

$ ./getfruitcolor.sh apple
The color of apple is Red

informação relacionada