Como faço para concatenar strings de uma lista em um script bash?

4

Como exemplo:

List="A B C D"
for I in $List
do
    OUT=$OUT" -$I"
done

Quando eu corro isso, o resultado é:

" -A -B -C -D"

mas quer que seja:

"-A -B -C -D"

Como faço para concatenar sem o espaço principal?

Este btw é uma lista de argumentos para um script.

    
por Seb S 17.09.2014 / 13:57

2 respostas

9

Use a expansão do parâmetro condicional :

List="A B C D"
for I in $List
do
    OUT=${OUT:+$OUT }-$I
done

A expressão ${OUT:+$OUT } se expande para nada se OUT não estiver definido ou vazio; se estiver configurado para alguma coisa, ele se expandirá para algo seguido por um espaço.

No entanto, esse tipo de operação - tratando uma string separada por espaço em branco como uma lista - está repleta de possíveis problemas: citações, valores que inesperadamente contêm espaços, etc. Seria melhor usar uma matriz:

List=(A B C D)
for I in "${List[@]}"
do    
    OUT=${OUT:+$OUT }-$I
done

Dependendo do que você está fazendo com $OUT , pode fazer sentido criar um array também:

List=(A B C D)
OUT=()
for I in "${List[@]}"; do
  OUT+=("-$I")
done

Então você usaria "${OUT[@]}" para passar os elementos da matriz para outro comando como argumentos separados.

Para voltar à sua versão original, neste caso específico, você também pode usar apenas sed e ignorar completamente o loop do bash:

OUT=$(sed -E 's/^| /&-/g' <<<"$List")
    
por 17.09.2014 / 14:13
0

Você pode remover o espaço inicial usando um comando após o loop for, como

OUT=${OUT# }

Levando para

List="A B C D"
for I in $List
do
    OUT=$OUT" -$I"
done
OUT=${OUT# }
    
por 17.09.2014 / 14:11