Imprima números de 1-50

2
x=1
while [ $x -le 50 ]
do
    echo $x
    $x=(($x + 1))
done

Eu escrevi o código acima. O que parece ser uma tarefa fácil em muitas linguagens de programação é dar esse erro para mim.

solution.sh: line 5: syntax error near unexpected token '('
solution.sh: line 5: '    $x=(($x + 1))'

Como depurar erros no bash. Existe algum IDE?

    
por WannaBeCoder 08.12.2014 / 12:47

9 respostas

7

Na linha 5: Altere $x=(($x + 1)) para x=$(($x + 1)) .

Em vez de usar um script bash inteiro, você pode usar apenas seq 1 50 .

Se o caso fosse x=$(($x + 2)) , você poderia usar seq 1 2 50 , onde 2 denota step / incremento.

    
por 08.12.2014 / 13:02
11

Um shell não é uma linguagem de programação (boa), é (antes de tudo) um interpretador de linha de comando. Use um comando de contagem se você quiser contar, não os comandos echo e [ em um loop.

Por exemplo, os sistemas GNU possuem o comando seq para isso. As alternativas são awk ou bc , por exemplo:

seq 50
echo 'for (i=1; i<=50; i++) i' | bc
awk 'BEGIN {for (i=1; i<= 50; i++) print i}'

Se você estiver usando um loop em shells, provavelmente você está indo para a abordagem errada.

    
por 08.12.2014 / 13:09
4

Use intervalos de expansão de chave

Outras respostas podem abordar como depurar seu script. Essa resposta mostra uma maneira mais simples (e menos propensa a erros) de fazer o que você quer usando A expansão do bracelete do Bash para gerar um intervalo em vez de um loop de incremento.

Por exemplo, para imprimir os números de 1 a 50 usando essa notação, você pode usar o seguinte snippet:

for x in {1..50}; do
    echo $x
done 

Isto irá imprimir corretamente cada número em seqüência, mas depende dos recursos do Bash que não são portáveis entre os shells. Se você precisar de portabilidade, considere usar seq .

    
por 08.12.2014 / 23:55
3

Existe um software chamado depurador BASH e outro software será shellcheck que lhe dará erros gerais, mas não todos.

No seu script na linha 5, use colchetes:

x=$[ $x + 1 ]

Atualizar

Ou

x=$(( $x + 1 ))

o anterior é deprimido, melhor usar este último. Não use $ antes de x , que vem antes de = sign

    
por 08.12.2014 / 13:01
1

Da sua outra pergunta sobre arredondar decimais, vejo que você quer fazer isso apenas no bash. Então, além das outras respostas, você pode fazer isso também.

#!/bin/bash
x=1
while [[ $x -le 50 ]]
do
    echo $x
    x=$(expr $x + 1)
done
    
por 08.12.2014 / 17:12
1

Bash como ksh e possivelmente algumas outras shells suportam nativamente os loops aritméticos:

for ((x=1;x<=50;x++)); do
    echo $x
done
    
por 08.12.2014 / 23:44
1

Print numbers from 1-50

printf '%s\n' {1..50}

imprima números de 1 a 50 com a etapa 2 (bash 4 +):

printf '%s\n' {1..50..2}
    
por 23.03.2018 / 11:19
1
#!/bin/bash
for i in $(seq 1 50)
do
echo $i
done

edite: desculpe postar minha resposta sem ler o guia e agradeço a Stephen Kitt para editar minha resposta.

Portanto, neste script, recebo a saída de seq 1 50 com a substituição de comando $() e repito essa saída (sequência de números de 1 a 50) com for e imprimo cada i nessa sequência com echo $i

E só porque você tenta imprimir os números com loop, eu implemento com loop. seq 1 50 ou echo {1..50} dará esses números também, sem usar iteração.

    
por 23.03.2018 / 09:20
0

Em sistemas com o comando jot (sistemas BSD):

jot 50
    
por 24.03.2018 / 12:43