2012-06-08 40 views
31

tôi có một kịch bản lệnh shell "script.sh" cho phép đầu ra là "thành công" hoặc "Không thành công" khi tôi thực thi trong cửa sổ unix. Bây giờ tôi muốn lưu đầu ra của script.sh vào một biến lệnh unix. say $a = {output of script.sh}Làm thế nào để lưu trữ đầu ra của kịch bản lệnh shell thành một biến trong Unix?

+0

thể trùng lặp của [shell script không thể lưu đầu ra từ dòng lệnh vào biến] (http:// stackoverflow.com/questions/10487379/shell-script-can-not-save-output-from-command-line-in-biến) –

+0

Khá giống với [đầu ra lệnh chuyển hướng thành đầu ra biến đổi và tiêu chuẩn trong ksh] (http://stackoverflow.com/questions/7901568/redirect-command-output-into-variable-and-standard-output-in-ksh) –

Trả lời

63

Hai ví dụ đơn giản để nắm bắt sản lượng pwd lệnh:

$ b=$(pwd) 
$ echo $b 
/home/user1 

hoặc

$ a=`pwd` 
$ echo $a 
/home/user1 

Cách thứ nhất được ưa thích. Lưu ý rằng không thể có bất kỳ dấu cách nào sau = để tính năng này hoạt động.

Ví dụ sử dụng một kịch bản ngắn:

#!/bin/bash 

echo "hi there" 

thì:

$ ./so.sh 
hi there 
$ a=$(so.sh) 
$ echo $a 
hi there 

Trong một cách tiếp cận linh hoạt hơn nói chung sẽ được trả lại một giá trị thoát khỏi lệnh và sử dụng nó để chế biến tiếp, mặc dù đôi khi chúng ta chỉ muốn nắm bắt đầu ra đơn giản từ một lệnh.

+0

có trả về một chuỗi. Tôi chỉ muốn lưu giá trị vào $ a – logan

+0

một lệnh có thể được thay thế bằng script.sh không? như: $ a = 'script.sh' sẽ lưu trữ một tập lệnh của script.sh? – logan

+0

cảm ơn .. hãy để tôi thử giải pháp đơn giản này – logan

2
export a=$(script.sh) 

Hy vọng điều này sẽ hữu ích. Lưu ý không có dấu cách giữa biến và =. Để echo đầu ra

echo $a 
+0

khi tập lệnh sẽ thực thi? sau khi gửi echo $ a? hoặc sau khi xuất khẩu? – logan

+0

Tại sao bạn xuất 'a'? Bạn nên sử dụng dấu ngoặc kép quanh '$ a' trong câu lệnh' echo'. –

+0

@login nó sẽ chạy script trong một subshell và đợi nó cho đến khi nó thoát, các luồng của subshell sẽ trỏ tới biến "a", nghĩa là mọi thứ chúng xuất ra sẽ được ghi vào biến thay vì đầu ra chuẩn của bạn main shell –

0

Bạn cần bắt đầu tập lệnh bằng dấu chấm trước, điều này sẽ đặt các biến đã xuất trong môi trường hiện tại.

#!/bin/bash 
... 
export output="SUCCESS" 

Sau đó thực hiện nó như vậy

chmod +x /tmp/test.sh 
. /tmp/test.sh 

Khi bạn cần toàn bộ đầu ra và không chỉ là một giá trị duy nhất, chỉ cần đặt đầu ra trong một biến như câu trả lời khác chỉ ra

+0

Không có lý do để "xuất" khi sử dụng nguồn. Ngoài ra, chỉ với một giá trị duy nhất, trạng thái thoát hoặc stdout có vẻ như chúng sẽ có ý nghĩa hơn. –

4

Bạn nên có thể viết lại kịch bản để trả về một giá trị thay vì xuất nó. Thay vì:

a=$(script.sh) # Now a is a string, either "success" or "Failed" 
case "$a" in 
    success) echo script succeeded;; 
    Failed) echo script failed;; 
esac 

bạn sẽ có thể làm:

if script.sh > /dev/null; then 
    echo script succeeded 
else 
    echo script failed 
fi 

Nó là đơn giản hơn nhiều cho các chương trình khác để làm việc với bạn kịch bản nếu họ không cần phải phân tích đầu ra. Đây là một thay đổi đơn giản để thực hiện. Chỉ cần exit 0 thay vì in successexit 1 thay vì in Failed. Tất nhiên, bạn cũng có thể in các giá trị đó cũng như thoát với giá trị trả về hợp lý để các kịch bản lệnh bao bọc có tính linh hoạt trong cách chúng hoạt động với tập lệnh.

+0

Như một lưu ý phụ, bạn sẽ muốn sử dụng 'success' và' failed' (lưu ý cách viết hoa nhất quán) trong bất kỳ mã thực nào, hoặc mọi thứ sẽ trở nên khó hiểu một cách nhanh chóng. –

2

Giả sử bạn muốn để lưu trữ các kết quả của một lệnh echo

echo hello 
x=$(echo hello) 
echo "$x",world! 

đầu ra:

hello 
hello,world! 
+0

@NitsanBaleli Đây là câu trả lời, không phải là câu hỏi – jean

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