প্রশ্ন একটি bash পরিবর্তনশীল খালি কিনা নির্ধারণ করতে?


ব্যাশে একটি পরিবর্তনশীল খালি ("") কিনা তা নির্ধারণ করার সেরা উপায় কী?

আমি শুনেছি যে এটা সুপারিশ করা হয়েছে if [ "x$variable" = "x" ]

যে হয় ঠিক উপায়? (আরো সহজতর কিছু হতে হবে)


721
2018-05-12 17:54


উত্স




উত্তর:


যদি একটি পরিবর্তনশীল সেট না করা থাকে বা খালি স্ট্রিং ("") তে সেট করা হয় তবে এটি সত্য ফিরে আসবে।

if [ -z "$VAR" ];

986
2018-05-12 18:06



যদি একটি পরিবর্তনশীল IS SET এর মূল্যের মধ্যে এটি অন্তর্ভুক্ত থাকে? - Brent
হ্যাঁ এটা ... "-z" একটি শূন্য দৈর্ঘ্যের স্ট্রিং জন্য পরীক্ষা করে। - David Z
if [ ! -z "$VAR" ]; - Aaron Copley
বিপরীত -z হয় -n  if [ -n "$VAR" ]; - Felipe Alvarez
ডাবল উদ্ধৃতি পরিবর্তনশীল বিভক্ত না নিশ্চিত করুন। আমার স্নাতকের $var কমান্ড লাইনটি তার হোয়াইটস্পেস দ্বারা পরামিতিগুলির একটি তালিকাতে বিভক্ত করা হবে "$var" সর্বদা শুধুমাত্র একটি পরামিতি হতে হবে। ভেরিয়েবলগুলি উদ্ধৃত করা প্রায়ই একটি ভাল অভ্যাস এবং হোয়াইটস্পেস সহ অন্যান্য ফাইলগুলির নামগুলি তোলার দ্বারা আপনাকে থামিয়ে দেয় (অন্যান্য জিনিসের মধ্যে)। উদাহরণ: করছেন পরে a="x --help"চেষ্টা করুন cat $a - এটি আপনাকে সাহায্য পৃষ্ঠা দেবে cat। তারপর চেষ্টা করুন cat "$a" - এটা (সাধারণত) বলতে হবে cat: x --help: No such file or directory। সংক্ষেপে, উদ্ধৃত করুন এবং প্রায়ই উদ্ধৃতি এবং আপনি প্রায় এটি অনুশোচনা করবেন না। - Score_Under


বাশে, যখন আপনি এটি সমর্থন করে না এমন শেলগুলিতে পোর্টেবিলিটির সাথে উদ্বিগ্ন না হন, তখন আপনার সর্বদা ডবল বন্ধনী সিনট্যাক্স ব্যবহার করা উচিত:

নিচের কোনটি:

if [[ -z $variable ]]
if [[ -z "$variable" ]]
if [[ ! $variable ]]
if [[ ! "$variable" ]]

বাশ, ডবল বর্গাকার বন্ধনী ব্যবহার করে, উদ্ধৃতি প্রয়োজন হয় না। আপনি একটি পরিবর্তনশীল জন্য পরীক্ষা সহজ করতে পারেন না একটি মান রয়েছে:

if [[ $variable ]]

এই সিনট্যাক্স ksh (কমপক্ষে ksh93, যাইহোক) সঙ্গে সামঞ্জস্যপূর্ণ। এটা বিশুদ্ধ POSIX বা sh বা dash যেমন পুরানো বোর্নে শেলগুলিতে কাজ করে না।

দেখ আমার উত্তর এখানে এবং BashFAQ / 031 ডবল এবং একক বর্গক্ষেত্র বন্ধনী মধ্যে পার্থক্য সম্পর্কে আরও তথ্যের জন্য।

আপনি একটি ভেরিয়েবল বিশেষভাবে অনির্দিষ্ট কিনা দেখতে পরীক্ষা করতে পারেন (একটি খালি স্ট্রিং থেকে স্বতন্ত্র হিসাবে):

if [[ -z ${variable+x} ]]

যেখানে "এক্স" নির্বিচারে হয়।

আপনি যদি একটি পরিবর্তনশীল নাল কিন্তু অনির্বাচিত না জানতে চান:

if [[ -z $variable && ${variable+x} ]]

227
2018-02-25 03:37



যে if [[ $variable ]] আমার জন্য সূক্ষ্ম কাজ, এবং এমনকি প্রয়োজন ছিল না set -u যে অন্য প্রস্তাবিত সমাধান এক দ্বারা প্রয়োজন ছিল। - Teemu Leisti
আমি এই গ্রহণযোগ্য উত্তর চেয়ে ভাল মনে হয়। - qed
কেন আপনি এমন একটি পোর্টেবল বৈশিষ্ট্য সুপারিশ করছেন যখন এটি কোন সুবিধা দেয় না? - Alastair Irvine
@AlastairIrvine: আমি আমার উত্তরের প্রথম বাক্যটিতে পোর্টেবিলিটি উল্লেখ করেছি, প্রশ্ন শিরোনাম এবং শরীরের মধ্যে "বাশ" শব্দ রয়েছে এবং প্রশ্নটি ট্যাগ করা হয়েছে সজোরে আঘাত, এবং ডবল বন্ধনী গঠন উপলব্ধ করা হয় পরিষ্কার সুবিধার অনেক উপায়ে. এবং আমি ধারাবাহিকতা এবং রক্ষণাবেক্ষণের কারণে মিশ্রণ বন্ধনী শৈলী সুপারিশ করবেন না। আপনি সর্বোচ্চ, সর্বনিম্ন সাধারণ সূচক পোর্টেবিলিটি প্রয়োজন, ব্যবহার করুন sh পরিবর্তে বাশ। এটি সরবরাহ করা বর্ধিত ক্ষমতাগুলির প্রয়োজন হলে, ব্যাশ ব্যবহার করুন এবং এটি সম্পূর্ণরূপে ব্যবহার করুন। - Dennis Williamson
@ ব্রুনোব্রোনিস্কিঃ আমি সম্পাদনাটি ফিরিয়ে দিলাম। জন্য কোন প্রয়োজন নেই ; শেষে. দ্য then সব একটি সেমিকোলন ছাড়া পরবর্তী লাইন হতে পারে। - Dennis Williamson


ব্যাশের (এবং কোনও POSIX- সামঞ্জস্যপূর্ণ শেল) একটি পরিবর্তনশীল তিনটি রাজ্যের মধ্যে হতে পারে:

  • সেট না
  • খালি স্ট্রিং সেট
  • একটি অ খালি স্ট্রিং সেট

বেশিরভাগ সময় আপনি শুধুমাত্র একটি অ্যার্য খালি স্ট্রিং সেট করা হয় কিনা জানতে প্রয়োজন, কিন্তু মাঝে মাঝে এটি অনির্দিষ্ট এবং খালি স্ট্রিং মধ্যে সেট করা মধ্যে পার্থক্য গুরুত্বপূর্ণ।

নিম্নলিখিত সম্ভাবনার উদাহরণ আপনি কীভাবে বিভিন্ন সম্ভাবনার পরীক্ষা করতে পারেন এবং এটি বাশ বা কোনও পক্সিক-উপযুক্ত শেলে কাজ করে:

if [ -z "${VAR}" ]; then
    echo "VAR is unset or set to the empty string"
fi
if [ -z "${VAR+set}" ]; then
    echo "VAR is unset"
fi
if [ -z "${VAR-unset}" ]; then
    echo "VAR is set to the empty string"
fi
if [ -n "${VAR}" ]; then
    echo "VAR is set to a non-empty string"
fi
if [ -n "${VAR+set}" ]; then
    echo "VAR is set, possibly to the empty string"
fi
if [ -n "${VAR-unset}" ]; then
    echo "VAR is either unset or set to a non-empty string"
fi

এখানে একই জিনিস কিন্তু সহজ টেবিলে ফর্ম:

                        +-------+-------+-----------+
                VAR is: | unset | empty | non-empty |
+-----------------------+-------+-------+-----------+
| [ -z "${VAR}" ]       | true  | true  | false     |
| [ -z "${VAR+set}" ]   | true  | false | false     |
| [ -z "${VAR-unset}" ] | false | true  | false     |
| [ -n "${VAR}" ]       | false | false | true      |
| [ -n "${VAR+set}" ]   | false | true  | true      |
| [ -n "${VAR-unset}" ] | true  | false | true      |
+-----------------------+-------+-------+-----------+

দ্য ${VAR+foo} যদি খালি স্ট্রিং প্রসারিত নির্মাণ VAR অনির্বাচিত বা হয় foo যদি VAR কিছু সেট করা হয় (খালি স্ট্রিং সহ)।

দ্য ${VAR-foo} গঠন মান বিস্তৃত VAR যদি সেট (খালি স্ট্রিং সেট সহ) এবং foo যদি সেট না। এটি ব্যবহারকারী-ওভারড্রেবল ডিফল্ট সরবরাহ করার জন্য উপযোগী (উদাঃ, ${COLOR-red} ব্যবহার করতে বলে red পরিবর্তনশীল না হওয়া পর্যন্ত COLOR কিছু সেট করা হয়েছে)।

কেন কারণ [ x"${VAR}" = x ] একটি পরিবর্তনশীল হয় অনির্বাচিত কিনা বা খালি স্ট্রিং সেট করা হয় কিনা তা পরীক্ষা করার জন্য প্রায়ই সুপারিশ করা হয় কারণ কিছু বাস্তবায়ন [ কমান্ড (হিসাবে পরিচিত test) বাগ। যদি VAR ভালো কিছু সেট করা হয় -n, তারপর কিছু বাস্তবায়ন দেওয়া যখন ভুল জিনিস করতে হবে [ "${VAR}" = "" ] কারণ প্রথম যুক্তি [ ভুলভাবে ব্যাখ্যা করা হয় -n অপারেটর, একটি স্ট্রিং না।


205
2018-04-24 20:39



খালি স্ট্রিং একটি পরিবর্তনশীল সেট জন্য পরীক্ষার ব্যবহার করা যাবে [ -z "${VAR-set}" ]। - nwellnhof
@ এনভেল্নহফঃ ধন্যবাদ! আমি Briefer সিনট্যাক্স ব্যবহার করার জন্য আমার উত্তর আপডেট। - Richard Hansen
@ ফাহিম মিঠা: এটা আপনার দোষ নয় - আমার উত্তর পড়া কঠিন ছিল। আমি আশা করি আরো একটি উত্তর টেবিলে আরো স্পষ্ট করে তুলব। - Richard Hansen
@ রিচার্ডহানসেন: ধন্যবাদ, এটি একটি দরকারী সংযোজন। - Faheem Mitha
অনির্বাচিত চেক নির্ভরযোগ্য নয়। ব্যবহারকারী বলা হয় set -u অথবা set -o nounset ব্যাশে, তারপর পরীক্ষাটি কেবল "ব্যাশ: VAR: আনবাউন্ড পরিবর্তনশীল" ত্রুটিটির ফলস্বরূপ হবে। দেখ stackoverflow.com/a/13864829 আরো নির্ভরযোগ্য অনির্বাচিত চেক জন্য। আমার যান-একটি পরিবর্তনশীল নাল বা অনির্বাচিত কিনা তা পরীক্ষা করতে যান [ -z "${VAR:-}" ]। একটি পরিবর্তনশীল অ খালি কিনা আমার চেক [ "${VAR:-}" ]। - Kevin Jin


-z একটি ভাল উপায়।

আমি ব্যবহার করেছি অন্য বিকল্প একটি পরিবর্তনশীল সেট করা হয়, কিন্তু এটি অন্য পরিবর্তনশীল উদাহরণ দ্বারা overridden করা যেতে পারে

export PORT=${MY_PORT:-5432}

যদি $MY_PORT পরিবর্তনশীল তারপর, খালি PORT 5432 সেট পায়, অন্যথায় পোর্ট মান সেট করা হয় MY_PORT। উল্লেখ্য সিনট্যাক্স কলোন এবং ড্যাশ অন্তর্ভুক্ত।


36
2018-06-11 13:19



দুর্ঘটনাক্রমে এই আজ পাওয়া যায়, এবং আমি ঠিক কি ছিল। ধন্যবাদ! আমি সহ্য করতে হবে set -o nounset কিছু স্ক্রিপ্টে। - opello


যদি আপনি সেট-খালি বনাম বিপরীত অবস্থাগুলির ক্ষেত্রে পার্থক্য করতে আগ্রহী হন তবে bash--U বিকল্পটি দেখুন:

$ set -u
$ echo $BAR
bash: BAR: unbound variable
$ [ -z "$BAR" ] && echo true
bash: BAR: unbound variable
$ BAR=""
$ echo $BAR

$ [ -z "$BAR" ] && echo true
true

24
2018-05-12 18:21





একটি বিকল্প আমি দেখা করেছি [ -z "$foo" ] নিম্নলিখিত, তবে আমি নিশ্চিত নই কেন মানুষ এই পদ্ধতি ব্যবহার করে, কেউ জানেন?

[ "x${foo}" = "x" ]

যাইহোক আপনি যদি অনির্দিষ্ট ভেরিয়েবল নিষ্ক্রিয় করছি (হয় set -u অথবা set -o nounset), তারপর আপনি উভয় পদ্ধতির সঙ্গে কষ্ট মধ্যে চালানো হবে। এতে একটি সহজ সমাধান রয়েছে:

[ -z "${foo:-}" ]

দ্রষ্টব্য: এই আপনার পরিবর্তনশীল undef ছেড়ে যাবে।


8
2017-10-20 03:58



বিকল্প সম্পর্কে একটি মন্তব্য আছে -z এ pubs.opengroup.org/onlinepubs/009695399/utilities/test.html। মূলত, এটি একটি বিকল্প হতে বোঝানো হয় না -z। বরং, এটা যেখানে ক্ষেত্রে পরিচালনা করে $foo যে একটি metacharacter দিয়ে শুরু কিছু প্রসারিত করতে পারে [ অথবা test দ্বারা বিভ্রান্ত করা হবে। শুরুতে একটি নির্বিচারে অ-metacaracter নির্বাণ যে সম্ভাবনা eliminates। - James Sneeringer


দ্য প্রশ্ন জিজ্ঞেস কিভাবে একটি পরিবর্তনশীল একটি খালি স্ট্রিং চেক করুন এবং সেরা উত্তর ইতিমধ্যে জন্য দেওয়া হয়।
কিন্তু আমি এখানে পিএইচপি প্রোগ্রামিং প্রোগ্রাম পাস করার পর এখানে এসেছি এবং আমি যা আসলে অনুসন্ধান করছিলাম তা হল চেক ফাঁকা ফাংশন ফাংশন একটি bash শেল কাজ।
উত্তরগুলো পড়ার পর আমি বুঝলাম আমি ব্যাশে সঠিকভাবে চিন্তা করছিলাম না, কিন্তু যে মুহূর্তে সেই মুহুর্তে একটি ফাংশন খালি php আমার bash কোডে soooo handy হয়েছে।
আমি মনে করি এটি অন্যের সাথে ঘটতে পারে বলে মনে করে, আমি php খালি ফাংশনকে ব্যাশ রূপে রূপান্তর করার সিদ্ধান্ত নিয়েছি

অনুযায়ী পিএইচপি ম্যানুয়াল:
একটি পরিবর্তনশীল খালি বলে মনে করা হয় যদি এটি অস্তিত্ব না থাকে অথবা তার মানটি নিম্নলিখিতগুলির মধ্যে একটি হয়:

  • "" (একটি খালি স্ট্রিং)
  • 0 (একটি পূর্ণসংখ্যা হিসাবে 0)
  • 0.0 (0 একটি ভাসমান হিসাবে)
  • "0" (একটি স্ট্রিং হিসাবে 0)
  • একটি খালি অ্যারে
  • একটি পরিবর্তনশীল ঘোষিত, কিন্তু একটি মান ছাড়া

অবশ্যই খালি এবং মিথ্যা ক্ষেত্রে bash রূপান্তর করা যাবে না, তাই তারা বাদ দেওয়া হয়।

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

বলার অপেক্ষা রাখে না যে, এই ফাংশনে শূন্যের চেকগুলি পার্শ্ব সমস্যাগুলির কারণ হতে পারে, এই ফাংশনটি ব্যবহার করে যে কেউ এই ঝুঁকিটি মূল্যায়ন করতে পারে এবং সম্ভবত সেই চেকগুলি কেটে প্রথমটি ছেড়ে চলে যেতে পারে।


6
2017-08-31 20:11



ফাংশন ভিতরে empty - তুমি কেন লিখলে? [[ $( echo "1" ) ]] ; return পরিবর্তে পরিবর্তে return 1 ? - Dor


পুরো যদি তারপর এবং -Z অপ্রয়োজনীয় হয়।

["$ foo"] & echo "foo খালি নেই"
["$ foo"] || echo "foo প্রকৃতপক্ষে খালি"

5
2018-01-26 14:02



Foo শুধুমাত্র স্পেস থাকে যদি যে ব্যর্থ হবে - Brian
যদি কিছু শেল মধ্যে ব্যর্থ হবে foo বিন্যাস এটি একটি ড্যাশ দিয়ে শুরু হয় যেহেতু এটি একটি বিকল্প হিসাবে ব্যাখ্যা করা হয়। উদাহরণস্বরূপ সৌরজ উপর ksh, zsh এবং সজোরে আঘাত কোন সমস্যা নেই, SH এবং / বিন / পরীক্ষা অকৃতকার্য হবে - ktf


এটি ঠিক যখন $ FOO সেট এবং খালি হয় ঠিক হয়:

[ "${FOO+x}" = x ] && [ -z "$FOO" ]

4
2018-05-20 20:52