Eu sei como criar um for
loop aritmético bash
.
Como se pode fazer um loop equivalente em um script de shell POSIX?
Como existem várias maneiras de alcançar o mesmo objetivo, sinta-se à vontade para adicionar sua própria resposta e elaborar um pouco sobre como ele funciona.
Um exemplo de um desses bash
loop é apresentado a seguir:
#!/bin/bash
for (( i=1; i != 10; i++ ))
do
echo "$i"
done
shell-script
posix
bourne-shell
LinuxSecurityFreak
fonte
fonte
Respostas:
Encontrei informações úteis no wiki Shellcheck.net , cito:
Bater:
POSIX:
embora tenha cuidado com o que
i++
não é POSIX, teria de ser traduzido, por exemplo, parai += 1
oui = i + 1
.Portanto, o script acima na pergunta pode ser reescrito no POSIX usando regras como esta:
Embora aqui, você pode torná-lo mais legível com:
como
init
estamos atribuindo um valor constante, não precisamos avaliar uma expressão aritmética. Oi != 10
intest
pode ser facilmente traduzido para uma[
expressão enext
, usando uma atribuição de variável do shell em oposição a uma atribuição de variável dentro de uma expressão aritmética, nos livramos da:
necessidade de citar.Ao lado de
i++
->i = i + 1
, há mais traduções de construções específicas do ksh / bash que não são POSIX que você pode precisar fazer:i=1, j=2
. O,
operador aritmético não é realmente POSIX (e entra em conflito com o separador decimal em algumas localidades com ksh93). Você poderia substituí-lo por outro operador, como+
no exemplo,: "$(((i=1) + (j=2)))"
mas o usoi=1 j=2
seria muito mais legível.a[0]=1
: sem matrizes em shells POSIXi = 2**20
: nenhum operador de energia na sintaxe do shell POSIX.<<
é suportado, porém, 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 no baú da ferramenta POSIX éi=$(awk 'BEGIN{srand(); print int(rand() * 3)}')
.fonte
obrigado pelo conhecimento aprofundado acima sobre a diferença. Uma queda na substituição que funcionou para mim ao usar o shellcheck.net foi a seguinte.
BATER
POSIX
algumas pessoas notaram que a seq também é uma opção usando a seq 1 10. Criando um loop, no entanto, isso depende de que os tenha seq.
fonte