Eu sei como criar um for
loop aritmético em bash
.
Como alguém pode fazer um loop equivalente em um script de shell POSIX?
Como existem várias maneiras de atingir o mesmo objetivo, sinta-se à vontade para adicionar sua própria resposta e elaborar um pouco sobre como funciona.
Segue um exemplo de um desses bash
loops:
#!/bin/bash
for (( i=1; i != 10; i++ ))
do
echo "$i"
done
Encontrei informações úteis no wiki Shellcheck.net , cito:
Bash¹:
POSIX:
embora tenha cuidado, pois
i++
não é POSIX, portanto, teria que ser traduzido, por exemplo, parai += 1
oui = i + 1
.:
é um comando nulo que sempre tem um código de saída bem-sucedido."$((expression))"
é uma expansão aritmética que está sendo passada como um argumento para:
. Você pode atribuir variáveis ou fazer aritmética/comparações na expansão aritmética.Portanto, o script acima na pergunta pode ser reescrito em POSIX usando essas regras como esta:
Embora aqui, você pode torná-lo mais legível com:
como em
init
, estamos atribuindo um valor constante, então não precisamos avaliar uma expressão aritmética. Oi != 10
intest
pode ser facilmente traduzido para uma[
expressão, e paranext
, usando uma atribuição de variável shell em vez de uma atribuição de variável dentro de uma expressão aritmética, nos livramos da:
necessidade de aspas.Além de
i++
->i = i + 1
, há mais traduções de construções específicas de ksh/bash que não são POSIX que você pode ter que fazer:i=1, j=2
. O,
operador aritmético não é realmente POSIX (e entra em conflito com o separador decimal em alguns locais com ksh93). Você poderia substituí-lo por outro operador como+
em,: "$(((i=1) + (j=2)))"
mas usari=1 j=2
seria muito mais legível.a[0]=1
: sem arrays em shells POSIXi = 2**20
: nenhum operador de energia na sintaxe do shell POSIX.<<
é suportado, entretanto, para potências de dois, pode-se usari = 1 << 20
. Para outros poderes, pode-se recorrer abc
:i=$(echo "3 ^ 20" | bc)
i = RANDOM % 3
: não POSIX. O mais próximo na caixa de ferramentas POSIX éi=$(awk 'BEGIN{srand(); print int(rand() * 3)}')
.¹ tecnicamente, essa sintaxe é do shell ksh93 e também está disponível em zsh além de bash
obrigado pelo conhecimento aprofundado acima sobre a diferença. Uma substituição que funcionou para mim ao usar o shellcheck.net foi a seguinte.
BASH
POSIX
algumas pessoas observaram que seq também é uma opção usando seq 1 10 . Criando um loop, no entanto, isso depende de os ter seq.
$
Este método é ainda mais geral, pois você pode inserir variáveis arbitrárias nele:Apenas certifique-se de ter o
seq
utilitário instalado, mas como está noCoreUtils
, você tem.