2012-11-22 40 views
45

मैं निम्न शेल स्क्रिप्ट चलाने की कोशिश कर रहा हूं, यह जांचना है कि कोई स्ट्रिंग न तो स्थान है और न ही खाली है। हालांकि, मुझे सभी 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 

उत्तर

76

आपको != के दोनों ओर एक स्थान की आवश्यकता है। करने के लिए अपने कोड में परिवर्तित करें:

shopt -s extglob # more powerful pattern matching 

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

Shell Parameter Expansion और Pattern Matching देखें बैश मैनुअल में: अगर एक स्ट्रिंग रिक्त है या इसमें केवल रिक्त आप इस्तेमाल कर सकते हैं शामिल हैं

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 
+0

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

+5

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

+0

@anishsane विवरण के लिए बहुत बहुत धन्यवाद, मुझे अब यह मिल गया है =) –

40

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

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

या

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

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

6

जांच करने के लिए।

+1

क्या आप इसे सीखने के उद्देश्यों के लिए थोड़ा सा समझा सकते हैं? यह gibberish ^^ की तरह दिखता है; क्या यह grep या कुछ की तरह है? –

+1

@ किथ एम: पोस्ट में दिए गए दस्तावेज़ों के लिंक देखें। –

11

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

अतिरिक्त सफेद स्थान की स्ट्रिंग निकालने के लिए (यह भी एक जगह के लिए बीच में खाली स्थान के condences):

trimmed=`echo -- $original` 

-- सुनिश्चित करता है कि अगर $original गूंज द्वारा समझा स्विच होता है, वे अभी भी रूप में सामान्य तर्क गूँजती माना जाएगा। "" को $original के आस-पास रखना महत्वपूर्ण नहीं है, या रिक्त स्थान हटाए नहीं जाएंगे।

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

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

बोर्न शेल में मैं ट्रिम किए गए मान के रूप में "-" के साथ समाप्त होता हूं। –

2

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

if [[ ! -z "${str/ //}" ]]; then 
    echo "It is not empty!" 
fi 
1
[ $(echo $variable_to_test | sed s/\n// | sed s/\ //) == "" ] && echo "String is empty" 

स्ट्रिंग से सभी नई-पंक्तियों और रिक्त स्थान स्ट्रिपिंग एक खाली एक कारण होगा कुछ भी नहीं है जो परीक्षण किया जा सकता है और

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^