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
shell?
./array_test.sh < war_and_peace.txt
.
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
shell?
./array_test.sh < war_and_peace.txt
.
Câu trả lời:
Đâ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ị:
Các chi tiết Bash-Scripting Guide có một lớn chương về mảng
Trang chủ của nội dung đã đọc
15 ví dụ mảng từ thegeek ware.com
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).
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.
IFS
vấ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 -r
cũng vậy ...
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à read
không có gì khi stdin
là 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 b
cá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 ống và trong bash đọc sau khi đường ống không đặt giá trị .
cat war_and_peace.txt | ./array_test.sh
.