Remover o último caractere de uma variável de eco

Remover o último caractere de uma variável de eco

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 $jtodas 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 ACCUMa 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 ACCUMcom qualquer coisa no final correspondente ,ao corte.

Se a seqopçã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 IFSvariá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 sedcomando 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/,$//'

informação relacionada