বাশনে কোনও ভেরিয়েবল খালি কিনা তা কীভাবে খুঁজে পাবেন


262

বাশ-এ কোনও ভেরিয়েবল খালি কিনা তা আমি কীভাবে পরীক্ষা করতে পারি?


2
কোন ধরণের শেল লিপি? * স্নো?
টিজে ক্রাউডার

8
বাশ শেল স্ক্রিপ্ট
গাছ



উত্তর:


383

বাশে অন্তত নিম্নলিখিত কমান্ড পরীক্ষা করে যদি $ var খালি থাকে :

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

আদেশ man testআপনার বন্ধু।


62
ডাবল স্কোয়ার বন্ধনী এখানে অকেজো। এটি সাধারণ [-z "$ var"] হতে পারে এমনকি আরও সহজ imho পরীক্ষা -২ "ভার" হতে পারে .. যাইহোক +1 :)
লুকা বোররিওন

2
ডাবল স্কোয়ার ব্র্যাকেটগুলি অকেজো নয়, যদি আমি ./test.ksh[8]: test: argument expectedইনক্লুড না করি তবে আমি ডানোট হচ্ছি কারণ একক বন্ধনীটি কাজ করে নি তবে ডাবলটির এটি ছিল।
gahlot.jaggs

8
@ লুকাবোরোনিওন আমার মনে হয় আপনি if test -z "$var"ঠিক বলেছেন?
neu242

1
সুনির্দিষ্ট পরিস্থিতির জন্য কেবলমাত্র একটি যুক্ত মন্তব্য যা সরাসরি প্রশ্নে উল্লিখিত হয়নি: যদি ভেরিয়েবলটি সেট না করা হয় এবং set -uবিকল্পটি সক্রিয় করা হয় তবে এই পরীক্ষাটি ব্যর্থ হবে unbound variable। এই ক্ষেত্রে, আপনি @ অ্যালেক্সলির সমাধানটি পছন্দ করতে পারেন।
এনোল

3
@ লুকাবোরোনিও ঠিক দেরী দিকের নোট হিসাবে: "[[" "কখনই অকেজো" হিসাবে দেখা যায়; ব্যবহার "[[" বেশি কিছু সুফল রয়েছে "[" হিসাবে (দেখুন 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
@ গুয়েটলি: যদি $variableখালি থাকে তবে তুলনা অপারেটরের বাম দিকে স্ট্রিংটি কেবল হয়ে যায় x, যা অপারেটরের ডানদিকে স্ট্রিংয়ের সমান। [ x = x ]"সত্য", সুতরাং অনুশীলনে এই পরীক্ষাগুলি $variableখালি কিনা তা নয়। সংযোজন হিসাবে (3- 3 বছর পরে সত্য :-)) যেহেতু -zআমি সম্ভবত এটি পরিষ্কারভাবেই যা চাই তা করি না তবে আমি এই উত্তরটি যুক্ত করতে চেয়েছিলাম কারণ এই পদ্ধতিটি ঘন ঘন "বুনো" দেখা যায়; আমার উদ্দেশ্য থেকে ভিন্ন অভিজ্ঞতা আছে এমন লোকেরা সম্ভবত উদ্দেশ্য নিয়ে এইভাবে লিখেছেন।
ড্যানিয়েল অ্যান্ডারসন

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

yesভেরিয়েবল সেট করা থাকলে মুদ্রণ । ${foo:+1}ভেরিয়েবল সেট হয়ে গেলে 1 ফিরে আসবে, অন্যথায় এটি খালি স্ট্রিংটি ফিরে আসবে।


2
প্রশ্নে উল্লেখ না করা অবস্থায়, এই উত্তরের একটি গুরুত্বপূর্ণ সুবিধা হ'ল এটি পরিবর্তনশীল অপরিজ্ঞাত এবং set -uবিকল্পটি ( nounset) সক্রিয় হওয়ার পরেও কাজ করে । এই প্রশ্নের প্রায় অন্য সমস্ত উত্তর unbound variableএই ক্ষেত্রে ব্যর্থ হবে ।
এনোল

এই :+স্বরলিপিটি এমন পরিস্থিতিতেও দরকারী যেখানে আপনার commandচ্ছিক কমান্ড লাইন প্যারামিটারগুলি রয়েছে যা আপনি alচ্ছিক ভেরিয়েবলগুলির সাথে নির্দিষ্ট করেছেন। myprogram ${INFILE:+--in=$INFILE} ${OUTFILE:+--out=$OUTFILE}
অ্যালান পোর্টার


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

কোনও ভেরিও প্লাস আউট করার দুর্দান্ত উপায়, 1
এহিম

@ ইহাইম আপনি যে ডিফল্ট মানটি ব্যবহার করবেন তা তৈরি করতে${variable:-default_value}
ওয়ারওয়ারিউক

কোনও ভেরিয়েবলের প্রবেশের বৈধতা যাচাইয়ের জন্য এটি একটি দ্রুত উপায় এবং সেট না করা থাকলে প্রস্থান: [ "$variable" ] || exit
মার্সেল সোনডেগ্রেগার

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?
ZiggyTheHamster

1
কেবলমাত্র দুটি বিবৃতিগুলির মধ্যে একটি পার্থক্য তৈরি করা, অর্থাৎ ব্যবহারের ! [ -z "$MyVar" ]অর্থ হ'ল ভেরিয়েবলের মধ্যে কিছু থাকবে have তবে আদর্শভাবে একজন ব্যবহার করবেন else
কেএসটিসি

6

প্রশ্ন জিজ্ঞেস করে একটি পরিবর্তনশীল একটি খালি স্ট্রিং কিনা চেক করতে কিভাবে এবং সেরা উত্তর ইতিমধ্যে যে জন্য দেওয়া হয়।

তবে আমি পিএইচপি-তে একটি পিরিয়ড প্রোগ্রামিং পাস করার পরে এখানে পৌঁছেছিলাম, এবং আমি আসলে পিএইচপি-তে খালি ফাংশনের মতো একটি চেক খুঁজছিলাম বাশ শেলের সাথে কাজ করে।

উত্তরগুলি পড়ার পরে আমি বুঝতে পেরেছিলাম আমি বাশ সম্পর্কে সঠিকভাবে ভাবছিলাম না, তবে এই মুহুর্তে পিএইচপি খালি মতো কোনও ফাংশন আমার বাশ কোডটিতে খুব সুন্দর হয়ে উঠবে।

যেহেতু আমি মনে করি এটি অন্যের সাথে ঘটতে পারে, আমি পিএইচপি খালি ফাংশনটিকে ব্যাশে রূপান্তর করার সিদ্ধান্ত নিয়েছি।

পিএইচপি ম্যানুয়াল অনুসারে :

একটি ভেরিয়েবলটি খালি বিবেচনা করা হয় যদি এটি বিদ্যমান না থাকে বা এর মান নিম্নলিখিতগুলির মধ্যে একটি হয়:

  • "" (একটি খালি স্ট্রিং)
  • 0 (0 পূর্ণসংখ্যা হিসাবে)
  • 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

বিটিডাব্লু, আমি প্রস্তাব দিচ্ছি যে set -uআনসেট ভেরিয়েবলগুলি পড়ার সময় কোন ত্রুটি ঘটবে, এটি আপনাকে বিপর্যয় থেকে রক্ষা করতে পারে যেমন

rm -rf $dir

আপনি এখানে "কঠোর মোড" এর জন্য এবং অন্যান্য সেরা অনুশীলনগুলি সম্পর্কে পড়তে পারেন ।


কঠোর মোড রেফারেন্সের জন্য ধন্যবাদ!
পলসিএম

1

ভেরিয়েবল v সেট করা হয়নি কিনা তা পরীক্ষা করতে

if [ "$v" == "" ]; then
   echo "v not set"
fi
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.