Làm thế nào tôi có thể kiểm tra nếu một biến trống trong Bash?
Làm thế nào tôi có thể kiểm tra nếu một biến trống trong Bash?
Câu trả lời:
Trong Bash ít nhất các lệnh sau kiểm tra nếu $ var trống :
if [[ -z "$var" ]]; then
# Do what you want
fi
Lệnh man test
là bạn của bạn.
./test.ksh[8]: test: argument expected
hiểu lý do nhưng dấu ngoặc đơn không hoạt động nhưng cái kép có nó.
if test -z "$var"
, phải không?
set -u
tùy chọn đã được kích hoạt, thử nghiệm này sẽ thất bại với unbound variable
. Trong trường hợp này, bạn có thể thích giải pháp của @ alexli.
Giả sử Bash:
var=""
if [ -n "$var" ]; then
echo "not empty"
else
echo "empty"
fi
-z
:[[ -z "$an_unset_or_empty_var" ]] && echo empty
-z
là gần với những gì được hỏi Jay đã đưa ra câu trả lời này vì vậy tôi sẽ không cập nhật thông tin của mình và để nguyên như vậy.
Tôi cũng đã thấy
if [ "x$variable" = "x" ]; then ...
đó rõ ràng là rất mạnh mẽ và vỏ độc lập.
Ngoài ra, có một sự khác biệt giữa "trống" và "không đặt". Xem Cách nhận biết nếu một chuỗi không được xác định trong tập lệnh shell Bash .
$variable
trống, thì chuỗi bên trái của toán tử so sánh chỉ trở thành x
, sau đó bằng với chuỗi bên phải của toán tử. [ x = x ]
là "đúng", vì vậy trong thực tế kiểm tra này có $variable
trống hay không. Như một sự bổ sung (3 năm rưỡi sau thực tế :-)) Tôi sẽ không bao giờ sử dụng cái này vì -z
tôi có thể muốn một cách rõ ràng hơn, nhưng tôi muốn thêm câu trả lời này vì phương pháp này thường được nhìn thấy "trong tự nhiên"; có lẽ được viết theo cách này trên mục đích bởi những người đã có kinh nghiệm khác với tôi.
if [ ${foo:+1} ]
then
echo "yes"
fi
in yes
nếu biến được đặt. ${foo:+1}
sẽ trả về 1 khi biến được đặt, nếu không nó sẽ trả về chuỗi rỗng.
set -u
tùy chọn ( nounset
) được kích hoạt. Hầu như tất cả các câu trả lời khác cho câu hỏi này sẽ thất bại unbound variable
trong trường hợp này.
:+
ký hiệu cũng hữu ích cho tình huống mà bạn có thông số dòng lệnh tùy chọn mà bạn đã xác định với các biến số tùy chọn. myprogram ${INFILE:+--in=$INFILE} ${OUTFILE:+--out=$OUTFILE}
if [[ "$variable" == "" ]] ...
[ "$variable" ] || echo empty
: ${variable="value_to_set_if_unset"}
${variable:-default_value}
[ "$variable" ] || exit
Điều này sẽ trả về true
nếu một biến không được đặt hoặc được đặt thành chuỗi trống ("").
if [ -z "$MyVar" ]
then
echo "The variable MyVar has nothing in it."
elif ! [ -z "$MyVar" ]
then
echo "The variable MyVar has something in it."
fi
elif !
thay vì else
?
! [ -z "$MyVar" ]
có nghĩa là biến đó sẽ có một cái gì đó trong đó. Nhưng lý tưởng nhất là người ta sẽ sử dụng else
.
Câu hỏi hỏi làm thế nào để kiểm tra xem một biến có phải là một chuỗi rỗng hay không và câu trả lời tốt nhất đã được đưa ra cho điều đó.
Nhưng tôi đã hạ cánh ở đây sau một thời gian thông qua lập trình trong PHP và tôi thực sự đang tìm kiếm một kiểm tra giống như hàm rỗng trong PHP hoạt động trong trình bao Bash.
Sau khi đọc các câu trả lời tôi nhận ra rằng tôi đã không suy nghĩ đúng đắn về Bash, nhưng dù sao trong thời điểm đó, một hàm như trống trong PHP sẽ rất tiện trong mã Bash của tôi.
Vì tôi nghĩ điều này có thể xảy ra với những người khác, tôi quyết định chuyển đổi hàm rỗng PHP trong Bash.
Theo hướng dẫn sử dụng PHP :
một biến được coi là trống nếu nó không tồn tại hoặc nếu giá trị của nó là một trong những điều sau đây:
Tất nhiên các trường hợp null và sai không thể được chuyển đổi trong bash, vì vậy chúng được bỏ qua.
function empty
{
local var="$1"
# Return true if:
# 1. var is a null string ("" as empty string)
# 2. a non set variable is passed
# 3. a declared variable or array but without a value is passed
# 4. an empty array is passed
if test -z "$var"
then
[[ $( echo "1" ) ]]
return
# Return true if var is zero (0 as an integer or "0" as a string)
elif [ "$var" == 0 2> /dev/null ]
then
[[ $( echo "1" ) ]]
return
# Return true if var is 0.0 (0 as a float)
elif [ "$var" == 0.0 2> /dev/null ]
then
[[ $( echo "1" ) ]]
return
fi
[[ $( echo "" ) ]]
}
Ví dụ về cách sử dụng:
if empty "${var}"
then
echo "empty"
else
echo "not empty"
fi
Bản trình diễn:
Đoạn mã sau:
#!/bin/bash
vars=(
""
0
0.0
"0"
1
"string"
" "
)
for (( i=0; i<${#vars[@]}; i++ ))
do
var="${vars[$i]}"
if empty "${var}"
then
what="empty"
else
what="not empty"
fi
echo "VAR \"$var\" is $what"
done
exit
đầu ra:
VAR "" is empty
VAR "0" is empty
VAR "0.0" is empty
VAR "0" is empty
VAR "1" is not empty
VAR "string" is not empty
VAR " " is not empty
Phải nói rằng trong logic Bash, các kiểm tra về số 0 trong hàm này có thể gây ra các vấn đề phụ, bất kỳ ai sử dụng hàm này nên đánh giá rủi ro này và có thể quyết định cắt bỏ các kiểm tra đó chỉ để lại kiểm tra đầu tiên.
Bạn có thể muốn phân biệt giữa các biến unset và biến được đặt và trống:
is_empty() {
local var_name="$1"
local var_value="${!var_name}"
if [[ -v "$var_name" ]]; then
if [[ -n "$var_value" ]]; then
echo "set and non-empty"
else
echo "set and empty"
fi
else
echo "unset"
fi
}
str="foo"
empty=""
is_empty str
is_empty empty
is_empty none
Kết quả:
set and non-empty
set and empty
unset
BTW, tôi khuyên bạn nên sử dụng set -u
sẽ gây ra lỗi khi đọc các biến không đặt, điều này có thể cứu bạn khỏi các thảm họa như
rm -rf $dir
Bạn có thể đọc về điều này và các thực tiễn tốt nhất khác cho "chế độ nghiêm ngặt" tại đây .