বাশ-এ কোনও ভেরিয়েবল খালি কিনা তা আমি কীভাবে পরীক্ষা করতে পারি?
বাশ-এ কোনও ভেরিয়েবল খালি কিনা তা আমি কীভাবে পরীক্ষা করতে পারি?
উত্তর:
বাশে অন্তত নিম্নলিখিত কমান্ড পরীক্ষা করে যদি $ var খালি থাকে :
if [[ -z "$var" ]]; then
# Do what you want
fi
আদেশ man test
আপনার বন্ধু।
./test.ksh[8]: test: argument expected
ইনক্লুড না করি তবে আমি ডানোট হচ্ছি কারণ একক বন্ধনীটি কাজ করে নি তবে ডাবলটির এটি ছিল।
if test -z "$var"
ঠিক বলেছেন?
set -u
বিকল্পটি সক্রিয় করা হয় তবে এই পরীক্ষাটি ব্যর্থ হবে unbound variable
। এই ক্ষেত্রে, আপনি @ অ্যালেক্সলির সমাধানটি পছন্দ করতে পারেন।
অনুমান বাশ:
var=""
if [ -n "$var" ]; then
echo "not empty"
else
echo "empty"
fi
-z
:[[ -z "$an_unset_or_empty_var" ]] && echo empty
-z
জিজ্ঞাসা করা হয়েছিল তার কাছাকাছি। জে তার উত্তরে এটি রেখেছেন তাই আমি আমার আপডেট করা থেকে বিরত থাকব এবং এটিকে রেখে দেব।
আমিও দেখেছি
if [ "x$variable" = "x" ]; then ...
যা স্পষ্টতই খুব মজবুত এবং শেল স্বতন্ত্র।
এছাড়াও, "খালি" এবং "আনসেট" এর মধ্যে পার্থক্য রয়েছে। বাশ শেল স্ক্রিপ্টে কোনও স্ট্রিং সংজ্ঞায়িত না করা আছে কীভাবে তা দেখুন দেখুন ।
$variable
খালি থাকে তবে তুলনা অপারেটরের বাম দিকে স্ট্রিংটি কেবল হয়ে যায় x
, যা অপারেটরের ডানদিকে স্ট্রিংয়ের সমান। [ x = x ]
"সত্য", সুতরাং অনুশীলনে এই পরীক্ষাগুলি $variable
খালি কিনা তা নয়। সংযোজন হিসাবে (3- 3 বছর পরে সত্য :-)) যেহেতু -z
আমি সম্ভবত এটি পরিষ্কারভাবেই যা চাই তা করি না তবে আমি এই উত্তরটি যুক্ত করতে চেয়েছিলাম কারণ এই পদ্ধতিটি ঘন ঘন "বুনো" দেখা যায়; আমার উদ্দেশ্য থেকে ভিন্ন অভিজ্ঞতা আছে এমন লোকেরা সম্ভবত উদ্দেশ্য নিয়ে এইভাবে লিখেছেন।
if [ ${foo:+1} ]
then
echo "yes"
fi
yes
ভেরিয়েবল সেট করা থাকলে মুদ্রণ । ${foo:+1}
ভেরিয়েবল সেট হয়ে গেলে 1 ফিরে আসবে, অন্যথায় এটি খালি স্ট্রিংটি ফিরে আসবে।
set -u
বিকল্পটি ( nounset
) সক্রিয় হওয়ার পরেও কাজ করে । এই প্রশ্নের প্রায় অন্য সমস্ত উত্তর unbound variable
এই ক্ষেত্রে ব্যর্থ হবে ।
:+
স্বরলিপিটি এমন পরিস্থিতিতেও দরকারী যেখানে আপনার commandচ্ছিক কমান্ড লাইন প্যারামিটারগুলি রয়েছে যা আপনি alচ্ছিক ভেরিয়েবলগুলির সাথে নির্দিষ্ট করেছেন। myprogram ${INFILE:+--in=$INFILE} ${OUTFILE:+--out=$OUTFILE}
if [[ "$variable" == "" ]] ...
[ "$variable" ] || echo empty
: ${variable="value_to_set_if_unset"}
${variable:-default_value}
[ "$variable" ] || exit
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
elif !
পরিবর্তে ব্যবহার করবেন কেন else
?
! [ -z "$MyVar" ]
অর্থ হ'ল ভেরিয়েবলের মধ্যে কিছু থাকবে have তবে আদর্শভাবে একজন ব্যবহার করবেন else
।
প্রশ্ন জিজ্ঞেস করে একটি পরিবর্তনশীল একটি খালি স্ট্রিং কিনা চেক করতে কিভাবে এবং সেরা উত্তর ইতিমধ্যে যে জন্য দেওয়া হয়।
তবে আমি পিএইচপি-তে একটি পিরিয়ড প্রোগ্রামিং পাস করার পরে এখানে পৌঁছেছিলাম, এবং আমি আসলে পিএইচপি-তে খালি ফাংশনের মতো একটি চেক খুঁজছিলাম বাশ শেলের সাথে কাজ করে।
উত্তরগুলি পড়ার পরে আমি বুঝতে পেরেছিলাম আমি বাশ সম্পর্কে সঠিকভাবে ভাবছিলাম না, তবে এই মুহুর্তে পিএইচপি খালি মতো কোনও ফাংশন আমার বাশ কোডটিতে খুব সুন্দর হয়ে উঠবে।
যেহেতু আমি মনে করি এটি অন্যের সাথে ঘটতে পারে, আমি পিএইচপি খালি ফাংশনটিকে ব্যাশে রূপান্তর করার সিদ্ধান্ত নিয়েছি।
পিএইচপি ম্যানুয়াল অনুসারে :
একটি ভেরিয়েবলটি খালি বিবেচনা করা হয় যদি এটি বিদ্যমান না থাকে বা এর মান নিম্নলিখিতগুলির মধ্যে একটি হয়:
অবশ্যই নাল এবং মিথ্যা মামলাগুলি ব্যাশে রূপান্তর করা যায় না, তাই এগুলি বাদ দেওয়া হয়।
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
এই কথাটি বলার পরে যে এই বাশার যুক্তিতে এই ফাংশনটিতে শূন্যের চেকগুলি পার্শ্ব সমস্যা তৈরি করতে পারে তবে, এই ফাংশনটি ব্যবহার করে যে কেউই এই ঝুঁকিটি মূল্যায়ন করতে পারে এবং কেবলমাত্র প্রথমটি রেখে এই চেকগুলি কেটে ফেলার সিদ্ধান্ত নিতে পারে।
আপনি সেট না থাকা এবং খালি সেট করা ভেরিয়েবল এবং ভেরিয়েবলের মধ্যে পার্থক্য করতে চাইতে পারেন:
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
আপনি এখানে "কঠোর মোড" এর জন্য এবং অন্যান্য সেরা অনুশীলনগুলি সম্পর্কে পড়তে পারেন ।