Tại sao bạn luôn nhận được sự thật? Hãy chơi một chút trong thiết bị đầu cuối của bạn trước tiên:
$ [[ hello ]] && echo "True"
Bạn nghĩ đầu ra là gì? (thử nó!) Và với những điều sau đây?
$ [[ "" ]] && echo "True"
(dùng thử!).
Tất cả các quyền, vì vậy có vẻ như một chuỗi không trống tương đương với biểu thức đúng, và một chuỗi rỗng (hoặc một biến chưa đặt) tương đương với biểu thức sai.
gì bạn đã làm như sau:
[[ $var=="" ]]
và
[[ $var!="" ]]
vì vậy bạn đã đưa ra một chuỗi không trống, đó là sự thật!
Để thực hiện việc kiểm tra, bạn thực sự cần không gian giữa các thẻ:
[[ $var == "" ]]
thay. Bây giờ, thử nghiệm của bạn sẽ được viết tốt hơn là:
if [[ -z "$var" ]]; then
echo "Empty String <<"
else
echo "$CPIC_MAX_CONV"
fi
(không có vỏ con và chỉ với một thử nghiệm).
Có nhiều điều để nói về kiểu kịch bản của bạn. Không có hành vi phạm tội, tôi sẽ nói rằng điều đó thực sự tồi tệ:
Không sử dụng backticks! Thay vào đó hãy sử dụng cấu trúc $(...)
. Do đó:
var="$(export | grep -i "CPIC_MAX_CONV" | awk '/CPIC_MAX_CONV/ { print $NF } ')"
Không sử dụng function blah
để xác định hàm.Chức năng của bạn nên đã được định nghĩa là:
cpic() {
local var="$(export | grep -i "CPIC_MAX_CONV" | awk '/CPIC_MAX_CONV/ { print $NF } ')"
if [[ -z "$var" ]]; then
echo "Empty String <<"
else
echo "$CPIC_MAX_CONV"
fi
}
Ồ, tôi sử dụng các từ khóa local
, bởi vì tôi đoán bạn sẽ không sử dụng biến var
bên ngoài của hàm cpic
.
Bây giờ, mục đích của hàm cpic
là gì và cụ thể là những thứ bạn đang xác định biến var
? Nó sẽ rất khó để mô tả (như có rất nhiều trường hợp bạn đã không nghĩ đến). (Btw, grep
của bạn có vẻ thực sự vô dụng ở đây). Dưới đây là một vài trường hợp, bạn bỏ qua:
- Một biến xuất khẩu được đặt tên
somethingfunnyCPIC_MAX_CONVsomethingevenfunnier
Một xuất khẩu biến chứa chuỗi CPIC_MAX_CONV
nơi nào đó, ví dụ:
export a_cool_variable="I want to screw up Randhawa's script and just for that, let's write CPIC_MAX_CONV somewhere here"
Ok, tôi don' t muốn mô tả những gì dòng của bạn đang làm chính xác, nhưng tôi loại đoán rằng mục đích của bạn là để biết liệu biến CPIC_MAX_CONV
được thiết lập và đánh dấu để xuất khẩu, phải không? Trong trường hợp đó, bạn sẽ tốt hơn chỉ với điều này:
cpic() {
if declare -x | grep -q '^declare -x CPIC_MAX_CONV='; then
echo "Empty String <<"
else
echo "$CPIC_MAX_CONV"
fi
}
Nó sẽ hiệu quả hơn và mạnh mẽ hơn nhiều.
Oh, tôi bây giờ chỉ cần đọc hết bài viết của bạn. Nếu bạn muốn chỉ cho biết nếu biến CPIC_MAX_CONV
được thiết lập (đối với một số giá trị không trống - có vẻ như bạn không quan tâm nếu nó được đánh dấu để xuất khẩu hay không, chính xác cho tôi nếu tôi sai), nó thậm chí còn đơn giản hơn (và nó sẽ hiệu quả hơn nhiều):
cpic() {
if [[ "$CPIC_MAX_CONV" ]]; then
echo "Empty String <<"
else
echo "$CPIC_MAX_CONV"
fi
}
cũng sẽ hoạt động!
Tôi nghĩ của 'if' như là một lệnh. Mọi thứ sau đây là các đối số được phân tách bằng dấu cách, giống như bất kỳ lệnh nào khác. –
@BarryBrown Để chính xác, 'if' là một từ khóa:' type if' trả về 'if là một từ khóa shell'. –
Tại sao không sử dụng từ khóa 'function'? –