Você deseja ler um inteiro e, em seguida, fazer um loop de 1 a esse inteiro, imprimindo o número em cada iteração:
#!/bin/bash
read -p 'number please: ' num
for (( i = 1; i <= num; ++i )); do
printf 'counter is at %d\n' "$i"
done
Observe como o $
não é usado ao ler o valor. Com $var
você obtém o valor da variável var
, mas read
precisa saber o nome da variável para ler, não seu valor.
ou, com um loop while,
#!/bin/bash
read -p 'number please: ' num
i=0
while (( ++i <= num )); do
printf 'counter is at %d\n' "$i"
done
O (( ... ))
em bash
é um contexto aritmético. Em tal contexto, você não precisa colocar $
em suas variáveis, e os valores das variáveis serão interpretados como inteiros.
ou, com /bin/sh
,
#!/bin/sh
printf 'number please: ' >&2
read num
i=1
while [ "$i" -le "$num" ]; do
printf 'counter is at %d\n' "$i"
i=$(( i + 1 ))
done
O teste -le
("menor que ou igual") precisa atuar em duas expansões de variáveis citadas (neste código). Se eles não fossem citados, como em [ $i -le $num ]
, então, se qualquer variável contivesse um caractere de globalização de concha ou um espaço, você poderia obter resultados inesperados ou erros. Além disso, a cotação protege os números caso a variável IFS
contenha dígitos.
Perguntas relacionadas: