Chuyển đổi tệp tham số thành các biến môi trường
Thông thường tôi đi về phân tích cú pháp thay vì tìm nguồn cung ứng, để tránh sự phức tạp của một số tạo phẩm nhất định trong tệp của tôi. Nó cũng cung cấp cho tôi những cách để đặc biệt xử lý báo giá và những thứ khác. Mục đích chính của tôi là giữ bất cứ điều gì xuất hiện sau '=' dưới dạng nghĩa đen, thậm chí là dấu ngoặc kép và dấu cách.
#!/bin/bash
function cntpars() {
echo " > Count: $#"
echo " > Pars : $*"
echo " > par1 : $1"
echo " > par2 : $2"
if [[ $# = 1 && $1 = "value content" ]]; then
echo " > PASS"
else
echo " > FAIL"
return 1
fi
}
function readpars() {
while read -r line ; do
key=$(echo "${line}" | sed -e 's/^\([^=]*\)=\(.*\)$/\1/')
val=$(echo "${line}" | sed -e 's/^\([^=]*\)=\(.*\)$/\2/' -e 's/"/\\"/g')
eval "${key}=\"${val}\""
done << EOF
var1="value content"
var2=value content
EOF
}
# Option 1: Will Pass
echo "eval \"cntpars \$var1\""
eval "cntpars $var1"
# Option 2: Will Fail
echo "cntpars \$var1"
cntpars $var1
# Option 3: Will Fail
echo "cntpars \"\$var1\""
cntpars "$var1"
# Option 4: Will Pass
echo "cntpars \"\$var2\""
cntpars "$var2"
Lưu ý mẹo nhỏ tôi phải làm để coi văn bản được trích dẫn của tôi là một tham số duy nhất có khoảng trống cho cntpars
chức năng của tôi . Có thêm một mức đánh giá cần thiết. Nếu tôi không làm điều này, như trong Tùy chọn 2, tôi đã chuyển 2 tham số như sau:
Trích dẫn kép trong khi thực hiện lệnh làm cho dấu ngoặc kép từ tệp tham số được giữ. Do đó, lựa chọn thứ 3 cũng thất bại.
Tất nhiên, tùy chọn khác sẽ chỉ đơn giản là không cung cấp các biến trong dấu ngoặc kép, như trong Tùy chọn 4, và sau đó chỉ để đảm bảo rằng bạn trích dẫn chúng khi cần.
Chỉ là một thứ để ghi nhớ trong đầu.
Tra cứu thời gian thực
Một điều khác tôi muốn làm là thực hiện tra cứu thời gian thực, tránh sử dụng các biến môi trường:
lookup() {
if [[ -z "$1" ]] ; then
echo ""
else
${AWK} -v "id=$1" 'BEGIN { FS = "=" } $1 == id { print $2 ; exit }' $2
fi
}
MY_LOCAL_VAR=$(lookup CONFIG_VAR filename.cfg)
echo "${MY_LOCAL_VAR}"
Không phải là hiệu quả nhất, nhưng với các tệp nhỏ hơn hoạt động rất sạch sẽ.