Làm thế nào tôi có thể đọc đầu vào của người dùng như một mảng trong Bash?


15

Làm thế nào tôi có thể đọc đầu vào của người dùng như một mảng trong bashshell?


Tôi đoán bạn muốn đọc từ stdin? Câu trả lời của tôi cũng sẽ làm việc với thực thi như thế nào cat war_and_peace.txt | ./array_test.sh.
Stefano Palazzo

Hoặc đơn giản ./array_test.sh < war_and_peace.txt.
Eliah Kagan

Câu trả lời:


14

Đây là một cách để làm điều đó:

while read line
do
    my_array=("${my_array[@]}" $line)
done

echo ${my_array[@]}

Nếu bạn chỉ chạy nó, nó sẽ tiếp tục đọc từ đầu vào tiêu chuẩn cho đến khi bạn nhấn Ctrl + D (EOF). Sau đó, các dòng bạn nhập sẽ vào my_array. Một số có thể tìm thấy mã này khó hiểu. Cơ thể của vòng lặp về cơ bản nói my_array = my_array + element.

Một số tài liệu thú vị:


3
read -rđôi khi khá hữu ích / quan trọng ... Liên kết của Stefano đến "trang chủ dựng sẵn" giải thích mục đích của nó ... (để ngăn chặn diễn giải dấu gạch chéo ngược).
Peter.O

10

Đọc nó bằng cách này:

read -a arr

Và để in, sử dụng:

for elem in ${arr[@]}
do 
  echo $elem
done

4

Và một cái không tạo lại mảng mỗi lần (mặc dù yêu cầu bash 3.1 hoặc mới hơn):

array=()
while IFS= read -r -p "Next item (end with an empty line): " line; do
    [[ $line ]] || break  # break if line is empty
    array+=("$line")
done

printf '%s\n' "Items read:"
printf '  «%s»\n' "${array[@]}"

Xem http://mywiki.wooledge.org/BashFAQ/001 để biết thêm.

Và như mọi khi, để tránh viết lỗi, hãy đọc http://mywiki.wooledge.org/BashGuide và tránh các hướng dẫn tldp như hướng dẫn kịch bản bash Nâng cao.


Liên kết tốt đẹp ... Cảm ơn bạn đã chỉ ra IFSvấn đề. Không loại bỏ nó, 'đọc các tập lệnh tất cả các khoảng trắng hàng đầu và dấu ... và tất nhiên -rcũng vậy ...
Peter.O

0

Làm thế nào về điều này một lót;)

arr=( $(cat -) )
echo ${arr[@]}

Biên tập:

Trong bash,

arr=(val1 val2 ...)

là cách gán cho một mảng . Sử dụng nó kết hợp với thay thế lệnh, bạn có thể đọc trong các mảng từ đường ống mà không thể sử dụng readđể thực hiện điều này theo cách đơn giản:

echo -e "a\nb" | read -a arr
echo ${arr[@]}

Bạn sẽ thấy rằng nó không tạo ra kết quả gì do thực tế là readkhông có gì khi stdinlà một đường ống vì một đường ống có thể được chạy trong một mạng con để biến đó có thể không sử dụng được.

Sử dụng cách được đề xuất bởi câu trả lời này:

arr=(`echo -e "a\nb"`)
echo ${arr[@]}

Nó đưa ra a bcách đơn giản và dễ hiểu hơn bất kỳ cách giải quyết nào được đưa ra bởi các câu trả lời của các giá trị Đọc thành một biến shell từ một đường ốngtrong bash đọc sau khi đường ống không đặt giá trị .


bạn đã kiểm tra nó chưa?
cmak.fr

@ cmak.fr vâng, nó hoạt động với tôi
Quark

@Melebius Tôi đã thêm một lời giải thích về nó và lợi thế của lớp lót này.
JiaHao Xu
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.