Làm cách nào để nối chuỗi từ danh sách trong tập lệnh bash?


4

Ví dụ:

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

Khi tôi chạy kết quả này là:

" -A -B -C -D"

nhưng muốn nó là:

"-A -B -C -D"

Làm thế nào để tôi nối mà không có không gian hàng đầu?

Btw này là một danh sách đối số cho một kịch bản.

Câu trả lời:


9

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

0

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# }
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.