Repita com base na entrada do usuário OS X

2

Estou criando um script que solicita que um usuário insira uma mensagem e quantas vezes ele gostaria de exibir essa mensagem.

Isso é o que eu tenho até agora.

message.sh

#!/bin/bash

echo -en "Enter a message to display: "
read -r MESSAGE

echo -en "How many times would like to repeat it? "
read -r REPEAT

for i in {1.."${REPEAT}"}; do
 echo "${MESSAGE}"
done

Saída real

Por exemplo, se eu inserir Hello para a mensagem e 5 para o número de repetições que serão exibir somente Hello apenas uma vez.

Resultado esperado

Hello
Hello
Hello
Hello
Hello

Como posso repeti-lo com base na entrada do usuário?

    
por Ryan Hawdon 24.01.2016 / 13:58

1 resposta

2

É uma questão de precedência. As expansões de chaves são avaliadas antes a variável é:

$ foo="10"
$ echo {1.."$foo"}
{1..10}

Ou, com mais detalhes:

$ set -x
$ echo {1.."$foo"}
+ echo '{1..10}'
{1..10}

Isso está documentado em man bash :

The order of expansions is: brace expansion; tilde expansion, parameter and variable expansion, arithmetic expansion, and command substitution (done in a left-to-right fashion); word splitting; and pathname expansion.

Em outras palavras, quando você tenta usar {1..$foo} , a primeira coisa que o bash fará é tentar avaliar a expansão da chave. Neste ponto, a variável ainda não foi substituída por seu valor, é simplesmente $foo . Portanto, o que o bash vê é equivalente a {1..SOMESTRING} :

$ echo {1..SOMESTRING}
{1..SOMESTRING}

Como esta é uma questão da ordem em que o shell executa determinadas operações, não há solução alternativa. Você simplesmente não pode usar variáveis dessa maneira dentro da expansão de chaves. Você terá que encontrar uma maneira diferente de fazer isso. Por exemplo, use seq :

for i in $(seq 1 "$REPEAT"); do
    echo "${MESSAGE}"
done

Ou:

for((i=0;i<=$REPEAT;i++)); do 
    echo "${MESSAGE}"
done
    
por 24.01.2016 / 14:17