Comprimento da string com script de shell [closed]

1

Estou trabalhando com o GRASS e tenho um problema com um vetor unidimensional de números. Agora, quero imprimir o tamanho desse vetor porque minha saída é assim:

(1,2,3,4,5,6,7,8,9,)
quando deve ficar assim:
(1,2,3,4,5,6,7,8,9)
ou seja, não preciso do último separador. Existe uma maneira de fazer isso?

Eu quero soluções compatíveis com POSIX; sem bashisms.

Meu código é assim:

for i in $CATS
do 
 step=$step"$i,"
 echo $step
 g.region --overwrite vector="region_uspo_$i," save=regions_uspo
 regions_uspos="region_$i,"
 echo $regions_uspos
done
    
por George Nostradamos 18.08.2017 / 23:56

3 respostas

0

Remova a última vírgula depois de terminar de criar a string.

for …
done
step=${step%,}
regions_uspos=${regions_uspos%,}

${VARIABLE%PATTERM} expande para o valor de VARIABLE com o menor sufixo correspondente PATTERN} removido. Esta construção é suportada em todos os shell POSIX. Também é suportado em todas as configurações do BusyBox.

Se você precisar das sequências intermediárias sem uma vírgula final, poderá retirar a vírgula final dentro do loop. Como alternativa, crie as cadeias sem uma vírgula final adicionando uma vírgula antes do elemento anexado. Para evitar ter uma vírgula inicial, detecte a primeira iteração através do loop.

first=1
for … do
  if [ -n "$first" ]; then
    first=
  else
    step="$step,"
    regions_uspos="$regions_uspos,"
  fi
  step="$step$i"
  …
done
    
por 19.08.2017 / 00:24
0

Muitas maneiras de fazer isso. Uma maneira é criar uma nova variável, por ex. sep, que está inicialmente vazio e está configurado para uma vírgula logo após você dizer step="$step$sep$i" .

Outra maneira é usar a expansão condicional, então você diz

step="${step+${step},}$i"

Onde o $ {name + value} se expande para valor se o nome estiver definido. Nesse caso, o valor é "$ step", supondo que eu esteja digitando corretamente no telefone.

Outra maneira é apenas remover a primeira vírgula da variável depois de acumular os valores nela.

    
por 19.08.2017 / 04:32
0

Sim, aparentemente, a resposta foi a seguinte:

for i in $var
do 
 step=$step"region_$i,"
done

step=${step%,}
echo $step
regions_uspos=${regions_uspos%,}

e foi baseado na resposta @Gilles

    
por 19.08.2017 / 11:24