Script de shell do Linux: permite que o usuário forneça nomes de variáveis no prompt de entrada

5

Estou escrevendo um script shell para o terminal linux. Eu quero ser capaz de inserir nomes de variáveis em um prompt. Por exemplo:

test.sh:

 test="Monkey in the middle..."
 read -p "Enter input: " input
 echo $input

saída:

 Enter input: $test
 $test

Eu quero poder inserir "$ test" durante o segmento de prompt read -p do script e ter o script ecoando "Monkey in the middle ..." no final, em vez de ecoar "$ test" como faz agora.

Como eu faria isso?

ATUALIZAÇÃO:

Usando as respostas fornecidas aqui e em esse tópico (um grande obrigado aos contribuidores e comentaristas!), eu consegui juntar essa linha que funcionou muito bem para mim:

newvariable="$(eval echo $input)" 

Seja, aconselhado, fui avisado mais de uma vez que o uso de eval pode representar um risco de segurança. Tenha isso em mente se você optar por esta solução.

    
por thebunnyrules 15.02.2016 / 02:24

3 respostas

4

Em vez de

echo "$input"

tente

eval echo "$input"

Não é nem bash-específico, funciona em / bin / sh!

Observe que isso representa um sério risco de segurança, pois eval apenas executa o que você fornece. Nesse caso, o shell interpreta a string $input as $test e, em seguida, eval executa echo $test . Mas e se o usuário inseriu $test; rm -rf * ? eval seria apresentado com echo $test; rm -rf * . Tenha muito cuidado se você fizer isso.

    
por 15.02.2016 / 07:36
2

No bash, você pode usar uma sintaxe expansão indireta de parâmetros :

test="Monkey in the middle..."
read -p "Enter input: " input
echo ${!input}

Nesse caso, o usuário deve fornecer apenas test sem o sinal de dólar precedente.

    
por 15.02.2016 / 02:45
1

Contanto que você não se importe que o usuário possa executar comandos arbitrários incluindo uma substituição de comando $(…) , você pode enviar a string para o eval builtin. Observe que eval espera um fragmento de shell e, se a entrada incluir aspas, elas podem causar erros de sintaxe. A maneira (relativamente) fácil de lidar com cotações é usar um documento aqui para executar as substituições. Você ainda está à mercê de uma variável não-terminada ou substituição de comando (por exemplo, $(foo ).

IFS= read -r -p "Enter input: " input
eval "string=\$(cat <<EOF
_${input}
EOF
)"
string=${string#_}
    
por 16.02.2016 / 02:19