4

В качестве примера:

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

Когда я запускаю это, результат:

" -A -B -C -D"

но хочу чтобы это было:

"-A -B -C -D"

Как объединить без пробела?

Это кстати список аргументов скрипта.

2 ответа2

9

Используйте расширение условного параметра:

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

Выражение ${OUT:+$OUT } расширяется до нуля, если OUT не установлен или пуст; если он установлен на что-то, то он расширяется до чего-то, за которым следует пробел.

Однако такого рода операция - обработка строки, разделенной пробелами, как списка - чревата возможными проблемами: цитированием, значениями, которые сами неожиданно содержат пробелы и т.д. Вам было бы лучше использовать массив:

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

В зависимости от того, что вы делаете с $OUT , возможно, имеет смысл также сделать его массивом:

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

Затем вы должны использовать "${OUT[@]}" для передачи элементов массива другой команде в качестве отдельных аргументов.

Чтобы вернуться к исходной версии, в этом конкретном случае вы также можете просто использовать sed и полностью пропустить цикл bash:

OUT=$(sed -E 's/^| /&-/g' <<<"$List")
0

Вы можете удалить начальный пробел, используя команду после цикла for, такую как

OUT=${OUT# }

Ведущий к

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .