2012-12-31 24 views
7

Tôi đặt một mảng làm biến môi trường theo cách này ví dụ: kịch bản test.shbash: đặt biến env mảng và không tham chiếu nó từ bất kỳ tập lệnh shell nào bị lỗi

trong test.sh nguồn

#!/bin/bash 
export STRING=("str1" "str2") 

test.sh

bây giờ trong kịch bản test-1.sh

#!/bin/bash 
echo ${STRING[0]} 

trả lời là không có gì, chỉ là một dòng trống, trong khi, nếu Tôi cố gắng đặt STRING="str1" trong test.sh và làm echo $STRING trong test-1.sh, tính năng này hoạt động.

kiểm tra được thực hiện từ người dùng root chỉ, Bây giờ làm thế nào để đặt mảng như biến env, để tôi có thể gọi các phần tử của mảng theo yêu cầu? Trước đó, tôi đã cố gắng thậm chí sửa đổi /etc/bashrc và điều đó cũng không dẫn đến bất kỳ điều gì tích cực.

Tôi cần đặt mảng dưới dạng biến env vì có thể có nhiều tập lệnh mà tôi phải viết sẽ sử dụng các cài đặt biến này.

ai cũng có thể cung cấp cho tôi đề xuất sửa lỗi cho tôi khi tôi đang làm sai?

Trả lời

10

Đọc phần hướng dẫn sử dụng tốt, phần "lỗi".

Biến số có thể chưa được xuất.

Mặc dù, tôi không biết nhiều người coi đây là lỗi thực sự. Các shell khác hỗ trợ các mảng kiểu ksh cũng không cho phép xuất chúng.

Bạn có thể chuyển các định nghĩa mảng một cách dễ dàng, thông qua các tham số hoặc biến hoặc môi trường. Nó không phải là thường rất hữu ích mặc dù.

function f { 
    unset -v "$2" 
    typeset "$2" 
    eval "${!1}" 
    typeset -p "$2" 
} 

typeset -a a=(a b c) 
myArr=$(typeset -p a) f myArr a 
0

Bạn đang cố gắng đặt mảng vào biến môi trường và biến môi trường chỉ có thể là chuỗi. bash không có phương thức cho việc sắp xếp/khử tuần tự các mảng đúng cách; làm như vậy bằng tay.

2

Sự hiểu lầm là trong suy nghĩ rằng biến môi trường chỉ được sử dụng bởi trình bao - chúng không phải. Không có thuộc tính nào, bao gồm cả chỉ đọc, số nguyên và mảng, có thể được xuất vào khối môi trường. Các biến môi trường có thể được đọc bởi bất kỳ ngôn ngữ nào, C, C++, Perl, Java, Python, PHP, v.v. Chúng cũng tồn tại trên Windows.

Vậy, ngôn ngữ khác có thể hỗ trợ các thuộc tính cụ thể của Bash như thế nào? Tất cả các biến môi trường được chuyển thành chuỗi, ngoại trừ trong Bash, nơi các giá trị mảng không được xuất khẩu.

Vỏ Korn sẽ chỉ xuất phần tử đầu tiên. ksh93 cũng thực hiện một số khai thác exec để bảo tồn các thuộc tính biến được xuất khẩu cho trẻ em Korn shell.

Bằng cách này, nó được coi là thực hành xấu để sử dụng UPPERCASE cho tên biến, vì chúng có thể va chạm với những cái được sử dụng bởi trình bao. Ngoài ra, trên Bash 3, tên STRING có vấn đề khi xuất (cố định trong Bash 4).

0

Biến môi trường được truyền từ quy trình cho con của họ là các chuỗi không có cấu trúc; mảng không thể được hỗ trợ. Bạn có thể chứng minh điều này trong Bash:

export x=foo 
printenv x 

Kết quả đầu ra foo. Nếu bây giờ tôi gây x để trở thành một mảng

x=(foo bar) 
printenv x 

Chúng tôi nhận thấy không có đầu ra (x không xuất khẩu).

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