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.
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?
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.
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 .
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
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
Bash
como ksh
e possivelmente algumas outras shells suportam nativamente os loops aritméticos:
for ((x=1;x<=50;x++)); do
echo $x
done
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}
#!/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.
Em sistemas com o comando jot
(sistemas BSD):
jot 50
Tags bash shell-script