जाँच करें कि क्या स्ट्रिंग न तो खाली है और न ही शेल स्क्रिप्ट में जगह है


92

मैं निम्नलिखित शेल स्क्रिप्ट को चलाने की कोशिश कर रहा हूं जो यह जांचने के लिए है कि क्या कोई स्ट्रिंग न तो जगह है और न ही खाली है। हालांकि, मैं सभी 3 उल्लिखित तारों के लिए एक ही आउटपुट प्राप्त कर रहा हूं। मैंने "[[" सिंटैक्स का उपयोग करने की कोशिश की है, लेकिन कोई फायदा नहीं हुआ।

यहाँ मेरा कोड है:

str="Hello World"
str2=" "
str3=""

if [ ! -z "$str" -a "$str"!=" " ]; then
        echo "Str is not null or space"
fi

if [ ! -z "$str2" -a "$str2"!=" " ]; then
        echo "Str2 is not null or space"
fi

if [ ! -z "$str3" -a "$str3"!=" " ]; then
        echo "Str3 is not null or space"
fi

मुझे निम्न आउटपुट मिल रहा है:

# ./checkCond.sh 
Str is not null or space
Str2 is not null or space

शेल स्क्रिप्टिंग में रिक्त तारों को अशक्त तार के रूप में जाना जाता है?
जोशिया योदर

जवाबों:


123

आपको इसके दोनों ओर एक स्थान चाहिए !=। अपना कोड बदलें:

str="Hello World"
str2=" "
str3=""

if [ ! -z "$str" -a "$str" != " " ]; then
        echo "Str is not null or space"
fi

if [ ! -z "$str2" -a "$str2" != " " ]; then
        echo "Str2 is not null or space"
fi

if [ ! -z "$str3" -a "$str3" != " " ]; then
        echo "Str3 is not null or space"
fi

बहुत बहुत धन्यवाद, यह काम करता है। लेकिन मुझे आश्चर्य है कि असाइनमेंट स्पेस का उपयोग क्यों नहीं करता जबकि तुलना करता है।
शुभांशु मिश्रा

5
^ ^ यह सिंटैक्स है। कमांड लाइन पर पहला शब्द कमांड है और बाद वाले तर्क हैं। var=value [command [args]]वह वाक्य रचना है, जिसमें एक चर को मान दिया जाता है। तुलना के लिए, [( /usr/bin/[) कमांड है और इसके लिए var1 की आवश्यकता है; =! और var2 में 3 अलग तर्क हैं। var1! = var2 एक एकल तर्क है।
ऐशसेन

62

खोल में खाली स्ट्रिंग की जांच के लिए

if [ "$str" == "" ];then
   echo NULL
fi

या

if [ ! "$str" ];then
   echo NULL
fi

9
शेल का स्ट्रिंग समानता ऑपरेटर है ===एक गैर पोर्टेबल युवा प्रोग्रामर के मन गड़बड़ करने के लिए खोल लेखकों द्वारा आविष्कार हैक है।
जेन्स

17

यदि आपको व्हाट्सएप की किसी भी राशि के खिलाफ जांच करने की आवश्यकता है, तो केवल एक स्थान नहीं, आप ऐसा कर सकते हैं:

अतिरिक्त सफेद स्थान की स्ट्रिंग को स्ट्रिप करने के लिए (एक स्थान के बीच में व्हाट्सएप को भी सम्मिलित करता है):

trimmed=`echo -- $original`

यह --सुनिश्चित करता है कि यदि $originalइको द्वारा समझे जाने वाले स्विच हैं, तो उन्हें अभी भी प्रतिध्वनित होने वाले सामान्य तर्क के रूप में माना जाएगा। इसके अलावा यह महत्वपूर्ण है कि ""चारों ओर न डालें $original, या रिक्त स्थान नहीं निकाले जाएंगे।

उसके बाद आप जांच कर सकते हैं कि क्या $trimmedखाली है।

[ -z "$trimmed" ] && echo "empty!"

3
बोर्न शेल में मैं छंटनी के मूल्य के रूप में "-" के साथ समाप्त होता हूं।
श्रीधर सरनोबत

इस पोस्ट के अनुसार , गूंज व्याख्या नहीं करता है - विकल्पों के अंत का मतलब है। मेरे बैश शेल में, मुझे श्रीधर सरनोबत के समान परिणाम
मिलते हैं

9

एक स्ट्रिंग के लिए एक और त्वरित परीक्षण इसमें कुछ है लेकिन स्थान है।

if [[ -n "${str// /}" ]]; then
    echo "It is not empty!"
fi

"-n" का अर्थ गैर-शून्य लंबाई स्ट्रिंग है।

फिर पहले दो स्लैश का मतलब सभी से मेल खाता है निम्नलिखित में से से , हमारे मामले में स्थान। फिर तीसरे स्लैश को प्रतिस्थापन (खाली) स्ट्रिंग के साथ और "}" के साथ बंद किया जाता है। सामान्य नियमित अभिव्यक्ति सिंटैक्स से अंतर पर ध्यान दें।

आप यहां बैश शेल स्क्रिप्टिंग में स्ट्रिंग हेरफेर के बारे में अधिक पढ़ सकते हैं ।


के [[ -n "$1" ]]रूप में ही नहीं है [[ ! -z "$1" "]]?
अलेक्जेंडर मिल्स

@AlexanderMills आप सही हैं, का उपयोग करते हुए यह थोड़ा छोटा होगा। मैंने सिर्फ उसी हिसाब से जवाब अपडेट किया।
एलोमेज

6

यह जांचने के लिए कि क्या कोई स्ट्रिंग खाली है या केवल व्हाट्सएप है जिसमें आप उपयोग कर सकते हैं:

shopt -s extglob  # more powerful pattern matching

if [ -n "${str##+([[:space:]])}" ]; then
    echo '$str is not null or space'
fi

बैश मैनुअल में शेल पैरामीटर विस्तार और पैटर्न मिलान देखें ।


1
[ $(echo $variable_to_test | sed s/\n// | sed s/\ //) == "" ] && echo "String is empty"

स्ट्रिंग से सभी newlines और रिक्त स्थान को अलग करने से रिक्त एक खाली हो जाएगा, जिसे कुछ भी नहीं जांचा जा सकता है और उस पर कार्रवाई की जा सकती है

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.