बैश में वैरिएबल खाली है या नहीं, यह कैसे पता करें


262

अगर बैश में वैरिएबल खाली है तो मैं कैसे जांच सकता हूं?


2
किस तरह की शेल स्क्रिप्ट? * nix?
टीजे क्राउडर

8
बैश शेल स्क्रिप्ट
ट्री



जवाबों:


383

बाश में कम से कम निम्नलिखित आदेश परीक्षण अगर $ var खाली है :

if [[ -z "$var" ]]; then
   # Do what you want
fi

आज्ञा man testआपकी मित्र है।


62
डबल वर्ग ब्रैकेट यहाँ बेकार हैं। यह सरल हो सकता है [-z "$ var"] या इससे भी आसान imho अगर परीक्षण -z "var" .. वैसे भी +1 :)
Luca Borrione

2
डबल वर्ग ब्रैकेट बेकार नहीं हैं, अगर मैं inlcude नहीं करता हूं, तो मुझे कारण पता नहीं चल रहा है, ./test.ksh[8]: test: argument expectedलेकिन एकल ब्रैकेट काम नहीं करता है, लेकिन डबल वाला था।
गहलोत। Jaggs

8
@LucaBorrione मुझे लगता है कि आप मतलब है if test -z "$var", है ना?
neu242

1
एक विशिष्ट स्थिति के लिए बस एक जोड़ा टिप्पणी सीधे सवाल में उल्लेख नहीं किया गया है: यदि चर परेशान है और set -uविकल्प सक्रिय हो गया है, तो यह परीक्षण विफल हो जाएगा unbound variable। इस मामले में, आप @ एलेक्सली समाधान पसंद कर सकते हैं।
अनोल

3
@LucaBorrione बस एक लेट साइड नोट के रूप में: "[[" को "कभी बेकार नहीं" के रूप में देखा जा सकता है; के रूप में "[[" का उपयोग करने के कुछ फायदे हैं "[" (देखें stackoverflow.com/questions/669452/… उदाहरण के लिए)
GhostCat

107

प्रकल्पित बैश:

var=""

if [ -n "$var" ]; then
    echo "not empty"
else
    echo "empty"
fi

9
अधिक प्रत्यक्ष उत्तर है -z:[[ -z "$an_unset_or_empty_var" ]] && echo empty
ग्लेन जैकमैन

4
@ जैगल जैकमैन: अच्छी टिप्पणी; यह सच है कि -zजो पूछा गया था, उसके करीब है। जय ने इसे अपने उत्तर में रखा है इसलिए मैं खदान को अपडेट करने से बचूंगा और इसे छोड़ दूंगा।
क्रिस्टोफीड

48

मैंने भी देखा है

if [ "x$variable" = "x" ]; then ...

जो स्पष्ट रूप से बहुत मजबूत और स्वतंत्र है।

इसके अलावा, "खाली" और "परेशान" के बीच अंतर है। देखें कि कैसे एक स्ट्रिंग को बैश शेल स्क्रिप्ट में परिभाषित नहीं किया गया है


मुझे अजीब लग रहा है। क्या आप कृपया इसका समाधान बता सकते हैं। धन्यवाद।
गुएतली

2
@guettli: यदि $variableखाली है, तो तुलना ऑपरेटर के बाईं ओर स्ट्रिंग केवल बन जाती है x, जो तब ऑपरेटर के दाईं ओर स्ट्रिंग के बराबर होती है। [ x = x ]"सच" है, इसलिए इस परीक्षण में कि क्या $variableखाली है या नहीं। इसके अलावा (तथ्य के बाद के साढ़े 3 साल)) मैं इसका इस्तेमाल कभी नहीं करूंगा क्योंकि -zमैं जो चाहता हूं वह शायद एक स्पष्ट तरीके से करता हूं, लेकिन मैं इस उत्तर को जोड़ना चाहता था क्योंकि इस पद्धति को अक्सर "जंगली" में देखा जाता है; शायद इस तरह से लोगों द्वारा उद्देश्य पर लिखा गया है, जो मेरे पास अलग-अलग अनुभव हैं।
डैनियल एंडरसन

30
if [ ${foo:+1} ]
then
    echo "yes"
fi

yesयदि चर सेट है तो प्रिंट करता है। ${foo:+1}चर सेट होने पर 1 वापस आ जाएगा, अन्यथा यह खाली स्ट्रिंग लौटेगा।


2
जबकि प्रश्न में उल्लेख नहीं किया गया है, इस उत्तर का एक महत्वपूर्ण लाभ यह है कि यह तब भी काम करता है जब चर अपरिभाषित हो और set -uविकल्प ( nounset) सक्रिय हो। इस प्रश्न के लगभग सभी अन्य उत्तर unbound variableइस मामले में विफल होंगे ।
अनोल

यह :+नोटेशन उन स्थितियों के लिए भी उपयोगी है, जहां आपके पास वैकल्पिक कमांड लाइन पैरामीटर हैं जिन्हें आपने वैकल्पिक चर के साथ निर्दिष्ट किया है। myprogram ${INFILE:+--in=$INFILE} ${OUTFILE:+--out=$OUTFILE}
एलन पोर्टर


10
[ "$variable" ] || echo empty
: ${variable="value_to_set_if_unset"}

एक var को डिफॉल्ट करने का शानदार तरीका, प्लस 1
ehime

@ आपके द्वारा तयशुदा मान का उपयोग करने के लिए${variable:-default_value}
warvariuc

यह एक चर की प्रविष्टि की वैधता की जांच करने का एक त्वरित तरीका है और यदि सेट नहीं है तो बाहर निकलें: [ "$variable" ] || exit
Marcel Sonderegger

8

यह तब लौटेगा, 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

3
elif !इसके बजाय आप क्यों इस्तेमाल करेंगे else?
जिग्गीमॉन्थ

1
बस दो कथनों के बीच अंतर करने के लिए, अर्थात उपयोग करने ! [ -z "$MyVar" ]का मतलब होगा कि चर में कुछ होगा । लेकिन आदर्श रूप में एक का उपयोग करेगा else
3kstc

6

सवाल पूछता है , तो एक चर स्ट्रिंग खाली है जांच करने का तरीका और सबसे अच्छा जवाब पहले से ही उस के लिए दिया जाता है।

लेकिन मैं यहां PHP में एक प्रोग्रामिंग पास करने के बाद उतरा, और मैं वास्तव में एक बैश शेल में काम करने वाले PHP में खाली फ़ंक्शन की तरह एक चेक की खोज कर रहा था ।

जवाबों को पढ़ने के बाद मैंने महसूस किया कि मैं बैश में ठीक से नहीं सोच रहा था, लेकिन किसी भी तरह उस पल में PHP में खाली जैसे एक फ़ंक्शन मेरे बैश कोड में soooo काम होता।

जैसा कि मुझे लगता है कि यह दूसरों के साथ हो सकता है, मैंने बैश में PHP खाली फ़ंक्शन को बदलने का फैसला किया।

PHP मैनुअल के अनुसार :

एक चर को खाली माना जाता है यदि वह मौजूद नहीं है या यदि उसका मूल्य निम्न में से एक है:

  • "" (एक रिक्त स्ट्रिंग)
  • 0 (0 पूर्णांक के रूप में)
  • 0.0 (एक फ्लोट के रूप में)
  • "0" (एक स्ट्रिंग के रूप में)
  • एक खाली सरणी
  • एक वैरिएबल घोषित, लेकिन बिना मूल्य के

बेशक, अशक्त और झूठे मामलों को बाश में परिवर्तित नहीं किया जा सकता है, इसलिए उन्हें छोड़ दिया जाता है।

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

एक बैश लॉजिक में कहा गया है कि इस फ़ंक्शन में शून्य पर चेक साइड समस्याओं का कारण बन सकते हैं, इस फ़ंक्शन का उपयोग करने वाले किसी भी व्यक्ति को इस जोखिम का मूल्यांकन करना चाहिए और हो सकता है कि केवल पहले वाले को छोड़कर उन चेक को काटने का निर्णय लिया जाए।


2

आप सेट और खाली होने वाले अनसेट चर और चरों के बीच अंतर करना चाहते हैं:

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

आप यहां "सख्त मोड" के लिए इस और अन्य सर्वोत्तम प्रथाओं के बारे में पढ़ सकते हैं ।


सख्त मोड संदर्भ के लिए धन्यवाद!
paulcm

1

यह जाँचने के लिए कि क्या चर v सेट नहीं है

if [ "$v" == "" ]; then
   echo "v not set"
fi
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.