79

Có tồn tại trong bash linux một cái gì đó tương tự như đoạn mã sau trong PHP:Linux bash: Nhiều biến phân

list($var1, $var2, $var3) = function_that_returns_a_three_element_array() ; 

ví dụ: bạn gán trong một câu một giá trị tương ứng với 3 biến khác nhau.

Giả sử tôi có hàm bash myBashFuntion ghi vào chuỗi stdout "qwert asdfg zxcvb". Có thể thực hiện điều gì đó như:

(var1 var2 var3) = (`myBashFuntion param1 param2`) 

Phần bên trái dấu bằng không phải là cú pháp hợp lệ. Tôi chỉ đang cố gắng giải thích những gì tôi đang yêu cầu.

gì không làm việc, mặc dù, như sau:

array = (`myBashFuntion param1 param2`) 
echo ${array[0]} ${array[1]} ${array[2]} 

Nhưng một mảng chỉ mục không phải là mô tả như tên biến đơn giản.
Tuy nhiên, tôi chỉ có thể làm:

var1 = ${array[0]} ; var2 = ${array[1]} ; var3 = ${array[2]} 

Nhưng những có nhiều 3 báo cáo mà tôi muốn tránh.

Tôi chỉ đang tìm cú pháp phím tắt. Có thể không?

Trả lời

152

Điều đầu tiên mà đi vào tâm trí tôi:

read -r a b c <<<$(echo 1 2 3) ; echo "$a|$b|$c" 

ra là, gì ngạc nhiên

1|2|3 
+0

Tại sao tôi không nghĩ về điều này trước đây. Cảm ơn – GetFree

+1

Cảm ơn rất đơn giản và liên tục. – pharaoh

+0

Đây là những gì tôi đang tìm kiếm, yêu SO rất nhiều, ;-) – Alcott

0

Chương 5 của Bash Cookbook bởi O'Reilly, thảo luận (tại một số chiều dài) lý do yêu cầu trong một nhiệm vụ biến mà không có dấu cách xung quanh dấu '=' ký hiệu

MYVAR="something" 

Lời giải thích có liên quan đến việc phân biệt giữa tên của một lệnh và một biến (trong đó '=' có thể là đối số hợp lệ).

Tất cả điều này có vẻ giống như biện minh sau sự kiện, nhưng trong mọi trường hợp, không có đề cập đến phương pháp gán cho danh sách biến.

+0

Vâng, tôi biết. Tôi chỉ cần thêm không gian thêm ở đây và ở đó vì lợi ích của khả năng đọc – GetFree

+0

Vâng, đó là sự thật: readbiity thực sự bị kịch bản bash. – pavium

4

Tôi nghĩ rằng đây có thể giúp ...

Để phá vỡ sử dụng đầu vào ngày (mm/dd/yyyy) trong kịch bản của tôi, tôi lưu trữ các ngày, tháng và năm vào một mảng, và sau đó đặt các giá trị vào các biến riêng biệt như sau:

DATE_ARRAY=(`echo $2 | sed -e 's/\// /g'`) 
MONTH=(`echo ${DATE_ARRAY[0]}`) 
DAY=(`echo ${DATE_ARRAY[1]}`) 
YEAR=(`echo ${DATE_ARRAY[2]}`) 
3

Đôi khi bạn phải làm điều gì đó sôi nổi. Hãy nói rằng bạn muốn đọc từ một lệnh (ví dụ ngày của SDGuero ví dụ) nhưng bạn muốn tránh nhiều dĩa.

read month day year << DATE_COMMAND 
$(date "+%m %d %Y") 
DATE_COMMAND 
echo $month $day $year 

Bạn cũng có thể đường ống vào lệnh đọc, nhưng sau đó bạn sẽ phải sử dụng các biến trong một subshell:

day=n/a; month=n/a; year=n/a 
date "+%d %m %Y" | { read day month year ; echo $day $month $year; } 
echo $day $month $year 

kết quả trong ...

13 08 2013 
n/a n/a n/a 
+0

Lệnh 'read' không xảy ra trong một vỏ bọc con vì niềng răng, đó là bởi vì bạn đã có lệnh đọc ở phía bên phải của đường ống. Bạn cần chạy lệnh 'read' trong shell hiện hành, bạn có thể thực hiện như' read day month year <<< \ 'date" +% d% m% Y "\' ' – pneumatics

+0

Không -' read' _happens_ nhưng phạm vi của các biến mà nó đọc rơi ra khỏi phạm vi khi subshell của đường ống kết thúc. – Otheus

+0

Nhận xét của tôi là về lý do _why_ việc đọc xảy ra trong một vỏ bọc, và tôi nhận ra bây giờ tôi đã hiểu sai những gì bạn đã viết. Tôi nghĩ bạn có nghĩa là subshell đã được tạo ra bởi vì bạn đã sử dụng các dấu ngoặc nhọn xung quanh câu lệnh ghép. Nhưng! Lý do bạn đưa ra ví dụ đó là để tránh bị nghẹt thở, và cũng không phải là ngã ba subshell? – pneumatics

12

Tôi muốn chỉ định giá trị cho mảng. Vì vậy, mở rộng tiếp cận Michael Krelin, tôi đã làm:

read a[{1..3}] <<< $(echo 2 4 6); echo "${a[1]}|${a[2]}|${a[3]}" 

trong đó sản lượng:

2|4|6 

như mong đợi.

+2

Để đặt các giá trị trong một mảng đã có một giải pháp đơn giản mà tôi đã đề cập trong câu hỏi: 'a = ($ (echo 2 4 6)); echo $ {a [0]} $ {a [1]} $ {a [2]} ' – GetFree

+0

Vâng, tôi đã bỏ qua điều đó. Tuy nhiên, tôi cho rằng đề xuất của tôi phù hợp hơn với việc gán các mảng lớn hơn. – soundray

+0

@soundray Giải pháp của bạn sử dụng tính năng mở rộng và một thuật ngữ, bash là những gì tôi nghi ngờ nó sẽ hoạt động tốt trong kịch bản đó (nhưng tôi không kiểm tra). –

Các vấn đề liên quan