শেল স্ক্রিপ্টে স্ট্রিং খালি না স্থান রয়েছে কিনা তা পরীক্ষা করুন


96

আমি নীচের শেল স্ক্রিপ্টটি চালানোর চেষ্টা করছি যা স্ট্রিংটি জায়গা বা খালি নয় তা যাচাই করার কথা। যাইহোক, আমি উল্লিখিত 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

খালি স্ট্রিংগুলি শেল স্ক্রিপ্টিংয়ে নাল স্ট্রিং হিসাবে পরিচিত?
জোশিয়াহ ইয়্ডার

উত্তর:


127

আপনার উভয় পাশে একটি স্থান প্রয়োজন !=। আপনার কোডটি এতে পরিবর্তন করুন:

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

অনেক ধন্যবাদ, এটি কাজ করে। তবে আমি অবাক হয়েছি কেন অ্যাসাইনমেন্টটি কোনও স্থান ব্যবহার করে না যখন একটি তুলনা করে।
শুভংশু মিশ্র

4
Synt এটি সিনট্যাক্স। কমান্ড লাইনের প্রথম শব্দটি হ'ল কমান্ড এবং পরবর্তী শব্দগুলি আর্গুমেন্ট। var=value [command [args]]এটি একটি বাক্য গঠন যা একটি ভেরিয়েবলের মান নির্ধারিত হয়। তুলনা করার জন্য, [( /usr/bin/[) হ'ল আদেশটি এবং এর জন্য পৃথক 3 টি আর্গুমেন্ট হতে! var1! = var2 একটি একক যুক্তি।
anishsane

65

শেলের খালি স্ট্রিং পরীক্ষা করার জন্য

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

বা

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

10
শেলের স্ট্রিং ইক্যুইটি অপারেটর =। এটি ==হ'ল একটি অ-বহনযোগ্য হ্যাক যা শেল লেখকরা তরুণ প্রোগ্রামারদের মনকে গোলমাল করার জন্য আবিষ্কার করেছিলেন।
জেনস

19

আপনার কেবলমাত্র একক স্পেস নয়, কোনও পরিমাণ শ্বেত স্পেসের বিরুদ্ধে পরীক্ষা করা প্রয়োজন, আপনি এটি করতে পারেন:

অতিরিক্ত সাদা স্থানের স্ট্রিংটি স্ট্র্যাপ করতে (মাঝখানে এক স্থানের সাদা অংশকেও ঘনীভূত করে):

trimmed=`echo -- $original`

--নিশ্চিত করে যে যদি $originalরয়েছে প্রতিধ্বনি বোঝা সুইচ তারা এখনও স্বাভাবিক আর্গুমেন্ট হিসাবে বিবেচনা করা হবে প্রতিধ্বনিত হবে। এছাড়াও এটি ""চারপাশে না রাখা গুরুত্বপূর্ণ $original, বা স্পেসগুলি সরানো হবে না।

এর পরে আপনি $trimmedখালি কিনা তা খতিয়ে দেখতে পারেন ।

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

4
বোর্ন শেলটিতে আমি ছাঁটাইয়ের মান হিসাবে "-" দিয়ে শেষ করি।
শ্রীধর সারনোবাত

এই পোস্ট অনুসারে , প্রতিধ্বনি ব্যাখ্যা করে না - মানে বিকল্পগুলির সমাপ্তি। আমার বাশ শেলের মধ্যে আমি শ্রীধর সরোবাত
মিঃ সি

10

এতে স্ট্রিংতে কিছু থাকার জন্য আর একটি দ্রুত পরীক্ষা।

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

"-n" এর অর্থ শূন্য নয় দৈর্ঘ্যের স্ট্রিং।

তারপর প্রথম দুই স্ল্যাশ মেলে মানে সব নিচের, আমাদের ক্ষেত্রে স্থান (গুলি) তে। তারপরে তৃতীয় স্ল্যাশ প্রতিস্থাপন (খালি) স্ট্রিংয়ের সাথে অনুসরণ করা হয় এবং "}" দিয়ে বন্ধ করা হয়। সাধারণ নিয়মিত প্রকাশের বাক্য গঠন থেকে পার্থক্যটি নোট করুন।

আপনি এখানে বাশ শেল স্ক্রিপ্টিংয়ের স্ট্রিং ম্যানিপুলেশন সম্পর্কে আরও পড়তে পারেন ।


নয় [[ -n "$1" ]]হিসাবে একই [[ ! -z "$1" "]]?
আলেকজান্ডার মিলস

@ আলেকজান্ডারমিলস আপনি ঠিক বলেছেন, -n ব্যবহার করে এটি কিছুটা খাটো হয়ে যাবে। আমি ঠিক সেই অনুযায়ী উত্তর আপডেট করেছি।
শ্রুতিমধু

7

কোনও স্ট্রিং খালি রয়েছে কিনা তা পরীক্ষা করতে আপনি কেবল ব্যবহার করতে পারেন এমন শ্বেত স্পেস রয়েছে:

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"

স্ট্রিং থেকে সমস্ত নতুনলাইন এবং স্পেসগুলি ছড়িয়ে দেওয়ার ফলে একটি ফাঁকা কিছুতেই হ্রাস পাবে যা পরীক্ষা করা এবং তার উপর অভিনয় করা যেতে পারে

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.