2012-01-16 5 views
5

Tôi có một hàm bash Unix thực hiện một tập lệnh phân tích các biến môi trường tùy chỉnh. Tôi muốn tránh xuất các biến có liên quan trong bash, và thay vào đó đặt chúng chỉ cho kịch bản, như là một phần của lệnh thực thi.Đặt biến môi trường cho tập lệnh trong biến hàm bash cục bộ

Nếu tôi đặt các biến trực tiếp trong lệnh - ví dụ: VARNAME=VARVAL script_name - nó hoạt động tốt. Tuy nhiên, vì tôi muốn đặt nhiều biến, dựa trên các điều kiện khác nhau, tôi muốn sử dụng một biến chức năng cục bộ để lưu trữ các thiết lập biến môi trường, và sau đó sử dụng biến này trong lệnh thực hiện kịch bản lệnh. Tôi có biến "vars" cục bộ được đặt cuối cùng, ví dụ: thành VARNAME=VAR, nhưng nếu tôi cố gắng chạy ${vars} script_name từ hàm bash của mình, tôi nhận được lỗi "không tìm thấy" cho phép gán biến $ vars - tức là, nội dung của $ vars được hiểu là một lệnh thay vì gán biến môi trường.

Tôi đã thử các biến thể khác nhau của cú pháp lệnh, nhưng cho đến nay không có kết quả. Hiện tại tôi phải xuất các biến có liên quan trong hàm, trước khi gọi tập lệnh, và sau đó bỏ đặt/đặt lại chúng thành các giá trị trước đó, nhưng đây không thực sự là giải pháp tôi mong đợi.

Mọi trợ giúp sẽ được đánh giá cao.

Cảm ơn, Sharon

Trả lời

3

Để đánh giá các nội dung của các biến của bạn như là một biểu thay vì như một lệnh bạn có thể thử sử dụng eval:

eval ${vars} script_Name 
+0

cảm ơn bạn đã trả lời nhanh chóng. Nó đã làm việc :-)! (Tôi thực sự đã thử sử dụng eval tại một số điểm, nhưng tôi vô tình sử dụng cú pháp sai.) – Sharon

+0

['eval' là ác] (http://mywiki.wooledge.org/BashFAQ/048) – l0b0

2

Tuy nhiên, kể từ khi tôi muốn thiết lập nhiều biến, dựa trên các điều kiện khác nhau, tôi muốn sử dụng biến chức năng cục bộ để lưu trữ cài đặt biến môi trường và sau đó sử dụng biến này trong thực thi tập lệnh n lệnh.

Bạn không cần phải lưu trữ các biến trong một biến riêng biệt. Bạn có thể gán nhiều hơn một biến cho một lệnh:

$ cat test.sh 
#!/usr/bin/env bash 
echo "$foo" 
echo "$bar" 
$ foo=abc bar=def ./test.sh 
abc 
def 

Điều này cũng có lợi thế là safer than eval.

+1

Tôi không chắc chắn làm thế nào điều này giúp tôi. Tôi không biết trước những giá trị biến nào cần được đặt cho tập lệnh. Tôi xác định điều này tại thời gian chạy bằng cách phân tích cú pháp cờ được chuyển đến hàm bash. Đó là lý do tại sao tôi sử dụng một biến - tôi cập nhật biến cục bộ với các biến môi trường dựa trên các phân tích tùy chọn hàm, và sau đó tôi sử dụng biến cục bộ trong lệnh gọi kịch bản lệnh. Một lần nữa, bằng cách sử dụng "eval" cho công trình này tốt. Lưu ý rằng tôi không muốn đặt các biến môi trường trong lời gọi hàm bash, vì tôi muốn sử dụng các cờ chức năng đơn giản hơn. – Sharon