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")