Câu trả lời:
Sử dụng mở rộng tham số có điều kiện :
List="A B C D"
for I in $List
do
OUT=${OUT:+$OUT }-$I
done
Cách diễn đạt ${OUT:+$OUT }
mở rộng thành không có gì nếu OUT không được đặt hoặc trống; nếu nó được đặt thành một cái gì đó, thì nó sẽ mở rộng ra thứ gì đó theo sau là khoảng trắng.
Tuy nhiên, loại hoạt động này - coi một chuỗi được phân tách bằng khoảng trắng như một danh sách - có nhiều vấn đề có thể xảy ra: trích dẫn, các giá trị bất ngờ chứa khoảng trắng, v.v.
List=(A B C D)
for I in "${List[@]}"
do
OUT=${OUT:+$OUT }-$I
done
Tùy thuộc vào những gì bạn đang làm với $OUT
, nó có thể có ý nghĩa để làm cho nó một mảng là tốt:
List=(A B C D)
OUT=()
for I in "${List[@]}"; do
OUT+=("-$I")
done
Sau đó, bạn sẽ sử dụng "${OUT[@]}"
để chuyển các phần tử của mảng sang một lệnh khác dưới dạng các đối số riêng biệt.
Để quay lại phiên bản gốc của bạn, trong trường hợp cụ thể này, bạn cũng có thể chỉ cần sử dụng sed
và bỏ qua hoàn toàn bash loop:
OUT=$(sed -E 's/^| /&-/g' <<<"$List")
Bạn có thể loại bỏ không gian hàng đầu bằng cách sử dụng lệnh sau vòng lặp for, chẳng hạn như
OUT=${OUT# }
Dẫn tới
List="A B C D"
for I in $List
do
OUT=$OUT" -$I"
done
OUT=${OUT# }