Làm cách nào để xóa dòng mới được thêm bởi readarray khi sử dụng dấu phân cách?


Câu trả lời:


12

Ký tự dòng mới ẩn không được thêm vào bởi readarraynội dung, nhưng bởi chuỗi ở đây ( <<<) của bash, hãy xem Tại sao chuỗi bash ở đây lại thêm chuỗi ký tự mới? . Bạn có thể loại bỏ điều đó bằng cách in chuỗi mà không cần sử dụng dòng mới printfvà đọc nó qua kỹ thuật thay thế quy trình< <()

readarray -td, ARR < <(printf '%s' "$VAR")
declare -p ARR

sẽ tạo đúng

declare -a ARR=([0]="a" [1]="b" [2]="c" [3]="d")

3
Ồ Tôi sẽ không bao giờ tìm thấy điều này. Cảm ơn
user1156544

4

Bạn có thể sử dụng split + global (điều gì xảy ra khi bạn để lại một bản mở rộng không được trích dẫn trong ngữ cảnh danh sách). Nó cản trở chúng ta hầu hết thời gian, sẽ thật xấu hổ nếu không sử dụng nó khi chúng ta thực sự cần nó:

IFS=,
set -o noglob

ARR=($VAR) # split+glob with glob disabled, and split using , as delimiter

Đó là một chút ít phức tạp hơn so với việc viết một tệp tạm thời và sau đó gọi readarraynó như trong readarray <<< "$string"cách tiếp cận (cũng lưu ý rằng readarray -dcần một phiên bản rất gần đây bash).

Lưu ý rằng mặc dù Strong IFS(viết tắt của separator ), mà hoạt động theo cách tương tự như readarrayở chỗ a,,b,là chia thành "a", """b"chỉ.

Đối với một toán tử chia tách thực sự, bạn có thể sử dụng zshthay thế:

ARR=("${(@s:,:)VAR}")

( @dấu ngoặc kép và dấu ngoặc kép để giữ nguyên các phần tử rỗng).


Việc readarray <<< "$string"ghi vào một tệp tempp và sau đó xóa nó thay vì sử dụng bộ nhớ?
dùng1156544

@ user1156544 Có.
mosvy

Làm thế nào tôi có thể làm một cái gì đó tương tự như lệnh cuối cùng của bạn trong bash? Tôi đang sử dụng bash 3.3 và cố gắng bù đắp sự thiếu hụtreadarray -d
user1156544

3

Phiên bản đóng hộp của câu trả lời của @ StéphaneChazelas:

# usage: setarray varname sep string
setarray(){ declare -n a=$1; local IFS=$2 -; set -f; a=($3); }

$ setarray arr , 1,2,3,
$ declare -p arr
declare -a arr=([0]="1" [1]="2" [2]="3")

$ setarray path : "$PATH"
$ setarray ld_preload ': ' "$LD_PRELOAD" # its elements can be separated by either ':' or spaces
...

Các local -sẽ làm cho các tùy chọn như set -f( noglob) địa phương để các chức năng, cũng giống như các biến.

Các declare -n a=$1sẽ tạo ra một địa phương biến anhư một bí danh cho biến toàn cầu được đặt tên bởi $1(đối số đầu tiên đến chức năng).

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.