В качестве примера:
List="A B C D"
for I in $List
do
OUT=$OUT" -$I"
done
Когда я запускаю это, результат:
" -A -B -C -D"
но хочу чтобы это было:
"-A -B -C -D"
Как объединить без пробела?
Это кстати список аргументов скрипта.
В качестве примера:
List="A B C D"
for I in $List
do
OUT=$OUT" -$I"
done
Когда я запускаю это, результат:
" -A -B -C -D"
но хочу чтобы это было:
"-A -B -C -D"
Как объединить без пробела?
Это кстати список аргументов скрипта.
Используйте расширение условного параметра:
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")
Вы можете удалить начальный пробел, используя команду после цикла for, такую как
OUT=${OUT# }
Ведущий к
List="A B C D"
for I in $List
do
OUT=$OUT" -$I"
done
OUT=${OUT# }