আইএফএস ksh93 এ সেট না থাকলে কীভাবে পরীক্ষা করবেন?


3

ভেরিয়েবলটি সেট না করা থাকলে এটি পরীক্ষা করা সহজ বলে মনে হয়। আমি কমপক্ষে তিনটি উপায় সম্পর্কে জানি:

#!/bin/ksh
unset var
[ "$#" -gt 0 ]               && var=$1
[ "${var+set}" != "${var}" ] && echo set1 || echo unset1
[ "${var+set}" ]             && echo set2 || echo unset2
[[ -v var ]]                 && echo set3 || echo unset3

এটি কার্যকর:

$ ./script
unset1
unset2
unset3

এছাড়াও দিয়ে চেষ্টা ./script ''এবং ./script 'value'

তবে, কেবল পরিবর্তনশীল নামটি পরিবর্তন করুন IFSএবং তিনটি পরীক্ষা ব্যর্থ হবে:

#!/bin/ksh
unset IFS
[ "$#" -gt 0 ]               && IFS=$1
[ "${IFS+set}" != "${IFS}" ] && echo set1 || echo unset1
[ "${IFS+set}" ]             && echo set2 || echo unset2
[[ -v IFS ]]                 && echo set3 || echo unset3

IFSKsh93 এ সেট না থাকলে প্রকৃতপক্ষে পরীক্ষা করার কোনও উপায় আছে ?


আমি ভেবেছিলাম if [[ "$IFS"a = a ]]তবে এটি নির্বিঘ্নে বলা হবে না যেটি IFSআনসেট করা আছে বা খালি রয়েছে।
আরকাদিউস দ্রবকিজিক

উত্তর:


1

হ্যা এটা সম্ভব. একটি উপায় (সম্ভবত সবচেয়ে সহজ নয়, তবে এটি কাজ করে) হ'ল এটিতে ভেরিয়েবল রয়েছে কিনা তা সমস্ত ভেরিয়েবলের তালিকা পরীক্ষা করা:

if [[ `set | grep ^IFS= | wc -l` == 0 ]]; then
    echo "IFS variable is unset (not declared)"
fi

বিকল্পভাবে, ছাড়াই wc(@ কুসালানন্দকে ধন্যবাদ, নীচে তাঁর নোটটি দেখুন):

if set | ! grep -q ^IFS= ; then
    echo "IFS variable is unset (not declared)"
fi

1
চলক আইএফএস রফতানি হয় না, সুতরাং, না, envএটি তালিকাবদ্ধ করবে না, তবে setতা করে। সুতরাং, হয়তো আমরা এই পরীক্ষাটি করতে পারেন: [[ $(set | grep 'IFS=') ]] && echo set || echo unset। তবে তা দেখতে কুৎসিত মনে হচ্ছে।
আইজাক

@ ইসহাক হ্যাঁ, দুঃখিত, আমার উত্তরটি সংশোধন করেছেন। এটি এখন আপনার জন্য কাজ করে কিনা তা আমাকে জানান। এটি সবচেয়ে মার্জিত উপায় নয় তবে এটি যদি কাজ করে তবে আমি সাধারণত বিল্ট-ইন ফাংশনগুলির পরিবর্তে গ্রেপ এবং ডাব্লুসিটি ব্যবহার করতে কোনও সমস্যা দেখতে পাই না।
নেড 64

2
কেন egrep? নিয়মিত প্রকাশটি কোনও বর্ধিত বৈশিষ্ট্য ব্যবহার করে না। এছাড়াও, if set | grep -q '^IFS='; then echo 'IFS is set'; else echo 'IFS is unset'; fiকম অগোছালো হবে।
কুসালানন্দ

@ কুসালানন্দ হ্যাঁ, আমি এটি বিকল্প হিসাবে যুক্ত করব। এছাড়াও, এটি আরও কিছুটা হ্রাস করা স্ট্রিংয়ের চারপাশে '' 'মুছে ফেলতে পারে।
নেড 64

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