
Este script funciona muito bem e eu o modifiquei para incrementar em 5. Meu problema é que não preciso da última vírgula no final e não sei como removê-la.
for ((i=1, j=0; i <= 12 ; i++, j=j+5))
do
echo -n "$j,"
done
Responder1
No GNU e em alguns outros sistemas, para este problema específico, basta usarseq
:
seq -s, 0 5 55
Isso dá a sequência de 0 a 55 (inclusive), separada por vírgula.
Existem algumas opções pure-bash, que podem ser úteis se o seu problema for um pouco mais complicado do que o exemplo sugere. O mais padrão é apenas usar um teste explícito para saber se você está na última iteração:
for ((i=1, j=0; i <= 12 ; i++, j=j+5))
do
echo -n "$j"
[ $i -lt 12 ] && echo -n ,
done
Aqui apenas imprimimos $j
todas as vezes e testamos se $i
é menor que 12 (ou seja, não estamos na última iteração) antes de imprimir a vírgula.
Uma alternativa é construir toda a saída como uma única string:
for ((i=1, j=0; i <= 12 ; i++, j=j+5))
do
ACCUM="$ACCUM$j,"
done
echo "${ACCUM%,}"
Aqui mantemos ACCUM
a mesma coisa que você já estava imprimindo, mas não geramos nada no loop em si. Você pode cortar a vírgula no final com ${ACCUM%,}
: thatexpande parao valor de ACCUM
com qualquer coisa no final correspondente ,
ao corte.
Se a seq
opção funcionar para o seu caso de uso, eu aceitaria isso.
Responder2
Você raramente precisa de um loop no bash:
echo {0..55..5} | sed 's/ /,/g'
Responder3
Em vez de adicionar vírgulas em todos os lugares e depois remover a última, aqui está uma solução potencial de 'puro bash' usando a IFS
variável na [*]
forma de expansão de array
a=( {0..55..5} ); (IFS=, ; printf '%s\n' "${a[*]}")
0,5,10,15,20,25,30,35,40,45,50,55
VerBashGuide/Matrizespara obter detalhes - incluindo uma explicação sobre o uso do subshell para preservar o valor (...)
do shell pai .IFS
Se você não quiser usar a abordagem de array, poderá evitar o sed
comando externo usando os recursos integrados de substituição de string do shell, por exemplo (novamente no bash)
printf -v str '%s,' {0..55..5}; printf '%s\n' "${str%,}"
0,5,10,15,20,25,30,35,40,45,50,55
Responder4
As soluções mais sofisticadas que você recebeu são melhores, mas por uma questão de integridade, você pode simplesmente remover a vírgula final com sed
:
for ((i=1, j=0; i <= 12 ; i++, j=j+5))
do
echo -n "$j,"
done | sed 's/,$//'