अगर बैश में वैरिएबल खाली है तो मैं कैसे जांच सकता हूं?
अगर बैश में वैरिएबल खाली है तो मैं कैसे जांच सकता हूं?
जवाबों:
बाश में कम से कम निम्नलिखित आदेश परीक्षण अगर $ var खाली है :
if [[ -z "$var" ]]; then
# Do what you want
fi
आज्ञा man test
आपकी मित्र है।
./test.ksh[8]: test: argument expected
लेकिन एकल ब्रैकेट काम नहीं करता है, लेकिन डबल वाला था।
if test -z "$var"
, है ना?
set -u
विकल्प सक्रिय हो गया है, तो यह परीक्षण विफल हो जाएगा unbound variable
। इस मामले में, आप @ एलेक्सली समाधान पसंद कर सकते हैं।
प्रकल्पित बैश:
var=""
if [ -n "$var" ]; then
echo "not empty"
else
echo "empty"
fi
-z
:[[ -z "$an_unset_or_empty_var" ]] && echo empty
-z
जो पूछा गया था, उसके करीब है। जय ने इसे अपने उत्तर में रखा है इसलिए मैं खदान को अपडेट करने से बचूंगा और इसे छोड़ दूंगा।
मैंने भी देखा है
if [ "x$variable" = "x" ]; then ...
जो स्पष्ट रूप से बहुत मजबूत और स्वतंत्र है।
इसके अलावा, "खाली" और "परेशान" के बीच अंतर है। देखें कि कैसे एक स्ट्रिंग को बैश शेल स्क्रिप्ट में परिभाषित नहीं किया गया है ।
$variable
खाली है, तो तुलना ऑपरेटर के बाईं ओर स्ट्रिंग केवल बन जाती है x
, जो तब ऑपरेटर के दाईं ओर स्ट्रिंग के बराबर होती है। [ x = x ]
"सच" है, इसलिए इस परीक्षण में कि क्या $variable
खाली है या नहीं। इसके अलावा (तथ्य के बाद के साढ़े 3 साल)) मैं इसका इस्तेमाल कभी नहीं करूंगा क्योंकि -z
मैं जो चाहता हूं वह शायद एक स्पष्ट तरीके से करता हूं, लेकिन मैं इस उत्तर को जोड़ना चाहता था क्योंकि इस पद्धति को अक्सर "जंगली" में देखा जाता है; शायद इस तरह से लोगों द्वारा उद्देश्य पर लिखा गया है, जो मेरे पास अलग-अलग अनुभव हैं।
if [ ${foo:+1} ]
then
echo "yes"
fi
yes
यदि चर सेट है तो प्रिंट करता है। ${foo:+1}
चर सेट होने पर 1 वापस आ जाएगा, अन्यथा यह खाली स्ट्रिंग लौटेगा।
set -u
विकल्प ( nounset
) सक्रिय हो। इस प्रश्न के लगभग सभी अन्य उत्तर unbound variable
इस मामले में विफल होंगे ।
:+
नोटेशन उन स्थितियों के लिए भी उपयोगी है, जहां आपके पास वैकल्पिक कमांड लाइन पैरामीटर हैं जिन्हें आपने वैकल्पिक चर के साथ निर्दिष्ट किया है। myprogram ${INFILE:+--in=$INFILE} ${OUTFILE:+--out=$OUTFILE}
if [[ "$variable" == "" ]] ...
[ "$variable" ] || echo empty
: ${variable="value_to_set_if_unset"}
${variable:-default_value}
[ "$variable" ] || exit
यह तब लौटेगा, true
जब कोई वैरिएबल न हो या खाली स्ट्रिंग ("") पर सेट हो जाए।
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 !
इसके बजाय आप क्यों इस्तेमाल करेंगे else
?
! [ -z "$MyVar" ]
का मतलब होगा कि चर में कुछ होगा । लेकिन आदर्श रूप में एक का उपयोग करेगा else
।
सवाल पूछता है , तो एक चर स्ट्रिंग खाली है जांच करने का तरीका और सबसे अच्छा जवाब पहले से ही उस के लिए दिया जाता है।
लेकिन मैं यहां PHP में एक प्रोग्रामिंग पास करने के बाद उतरा, और मैं वास्तव में एक बैश शेल में काम करने वाले PHP में खाली फ़ंक्शन की तरह एक चेक की खोज कर रहा था ।
जवाबों को पढ़ने के बाद मैंने महसूस किया कि मैं बैश में ठीक से नहीं सोच रहा था, लेकिन किसी भी तरह उस पल में PHP में खाली जैसे एक फ़ंक्शन मेरे बैश कोड में soooo काम होता।
जैसा कि मुझे लगता है कि यह दूसरों के साथ हो सकता है, मैंने बैश में PHP खाली फ़ंक्शन को बदलने का फैसला किया।
PHP मैनुअल के अनुसार :
एक चर को खाली माना जाता है यदि वह मौजूद नहीं है या यदि उसका मूल्य निम्न में से एक है:
बेशक, अशक्त और झूठे मामलों को बाश में परिवर्तित नहीं किया जा सकता है, इसलिए उन्हें छोड़ दिया जाता है।
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 "" ) ]]
}
उपयोग का उदाहरण:
if empty "${var}"
then
echo "empty"
else
echo "not empty"
fi
डेमो:
निम्नलिखित स्निपेट:
#!/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
आउटपुट:
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
एक बैश लॉजिक में कहा गया है कि इस फ़ंक्शन में शून्य पर चेक साइड समस्याओं का कारण बन सकते हैं, इस फ़ंक्शन का उपयोग करने वाले किसी भी व्यक्ति को इस जोखिम का मूल्यांकन करना चाहिए और हो सकता है कि केवल पहले वाले को छोड़कर उन चेक को काटने का निर्णय लिया जाए।
आप सेट और खाली होने वाले अनसेट चर और चरों के बीच अंतर करना चाहते हैं:
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
परिणाम:
set and non-empty
set and empty
unset
BTW, मैं उपयोग करने की सलाह देता हूं, set -u
जो परेशान चर पढ़ते समय एक त्रुटि का कारण होगा, यह आपको आपदाओं से बचा सकता है जैसे कि
rm -rf $dir
आप यहां "सख्त मोड" के लिए इस और अन्य सर्वोत्तम प्रथाओं के बारे में पढ़ सकते हैं ।