[-N] মিথ্যা [-n ""] এর মতো কেন হয় না?


20

আমার প্রশ্ন এই কোড দ্বারা উত্পাদিত রিটার্ন মান সম্পর্কে:

if [ -n ]; then echo "true"; else echo "false"; fi

এই মুদ্রণ true

এর পরিপূরক পরীক্ষাটি [ -z ]প্রিন্টগুলি ব্যবহার করে true:

if [ -z ]; then echo "true"; else  echo "false"; fi

উপরের কোডে, [ -n ]পরীক্ষা কেন নাল নয় , কেন স্ট্রিংয়ের মানটি মোটেও পাস হয় না?

নীচের কোডটি মুদ্রণ করে false। পাস হওয়া স্ট্রিংয়ের মান নাল এবং শূন্য দৈর্ঘ্যের হওয়ায় এটি প্রত্যাশিত।

if [ -n "" ]; then echo "true"; else  echo "false"; fi

উত্তর:


14

[এক্স] সমতূল্য [ -nএক্স] এমনকি যদি এক্স দিয়ে শুরু হয় -প্রদান করা কোন প্রতীক নেই।

$ [ -o ] ; echo $?
0
$ [ -eq ] ; echo $?
0
$ [ -n -o ] ; echo $?
0
$ [ -n -eq ] ; echo $?
0

4
লক্ষ্য করুন ঐতিহাসিকভাবে, [ -t ]পরীক্ষা ছিল কিনা stdout- এ একটি টার্মিনাল (ছোট ছিল [ -t 1 ]) এবং কিছু শাঁস এখনও এটা করছ (ক্ষেত্রে ksh93শুধুমাত্র যখন যে -tআক্ষরিক হয়), তাই এটা ব্যবহার করা ভালো [ -n "$var" ]চেয়ে [ "$var" ]। যদিও এখনও কিছু পুরানো মধ্যে ব্যর্থ হবে testএর মানের জন্য বাস্তবায়নের $varমত =, যে ক্ষেত্রে [ "" != "$var" ]বা [ "x$var" != x ]বা case $x in "")...ভাল হতে পারে।
স্টাফেন চেজেলাস

3
-oএখানে আকর্ষণীয় পছন্দ । কিছু শেলের মতো bash, -oউভয়ই অবিচ্ছিন্ন (কোনও বিকল্প সেট করা থাকে কিনা পরীক্ষা) এবং বাইনারি (বা) অপারেটর [ ! -o monitor ]উভয়ই তাই মত বিষয়গুলি অস্পষ্ট। এটি কি পরীক্ষা করছে যে monitorবিকল্পটি সেট করা নেই, বা হয় !বা monitorখালি খালি স্ট্রিং রয়েছে? পসিক্স নিয়মগুলি স্থির করে: পরেরগুলি (এটির সাথে আলাদা [[ ! -o monitor ]])।
স্টাফেন চেজেলাস

30

[ -n ]-nপরীক্ষা ব্যবহার করে না ।

-nমধ্যে [ -n ]এ সব একটি পরীক্ষা নয়। যখন [এবং এর মধ্যে যখন কেবল একটি যুক্তি থাকে তখন ]সেই আর্গুমেন্টটি এমন একটি স্ট্রিং যা পরীক্ষা করা হয় এটি খালি কিনা তা পরীক্ষা করার জন্য। এমনকি যদি সেই স্ট্রিংটির একটি শীর্ষস্থানীয় থাকে -, তখনও এটি পরীক্ষার পরিবর্তে অপারেন্ড হিসাবে ব্যাখ্যা করা হয়। যেহেতু স্ট্রিং -nখালি না থাকে - এটা দুই অক্ষর রয়েছে, -এবং n, না শূন্য অক্ষর [ -n ]মূল্যায়ণ সত্যতে।

হিসাবে ইগ্ন্যাশীয় Vazquez-Abrams বলছেন , যেখানে stringএকটি একক যুক্তি পরীক্ষা করা হয়ে থাকে, stringএ একই হিসাবে পরীক্ষা দ্বারা এটি সম্পাদনা । যখন হতে হয় , বিশেষ কিছুই ঘটে না। মধ্যে এবং দ্বিতীয় মধ্যে কেবল স্ট্রিং হয় শূন্যতা জন্য পরীক্ষা করা হচ্ছে।[ string ][ -n string ]string-n-n[ -n ]-n[ -n -n ]

যখন এর মধ্যে একটি মাত্র যুক্তি থাকে [এবং ]সেই যুক্তিটি সর্বদা অহংকারের জন্য পরীক্ষা করার জন্য একটি স্ট্রিং থাকে, যদিও এটি পরীক্ষার মতো একই নামকরণ হয় be একইভাবে, যখন [এবং এর মধ্যে দুটি তর্ক হয় এবং এর ]মধ্যে প্রথমটি হয় -n, দ্বিতীয়টি সর্বদা অহংকারের জন্য পরীক্ষা করার জন্য একটি স্ট্রিং থাকে, যদিও এটি পরীক্ষার মতো একই নামকরণ হয় happens এটি কেবল কারণ এটির জন্য সিনট্যাক্সটি [জোর দেয় যে এর মধ্যে [এবং ]পরে একটি একক যুক্তি -nএকটি স্ট্রিং অপরেন্ড nd

একই কারণে যে জন্য [ -n ]ব্যবহার করে না -nপরীক্ষা, [ -z ]ব্যবহার করে না -zপরীক্ষা।


এর জন্য সহায়তা পরীক্ষা করে [আপনি এ সম্পর্কে আরও শিখতে bashপারেন। লক্ষ্য করুন যে এটি একটি শেল অন্তর্নির্মিত :

$ type [
[ is a shell builtin

সুতরাং আপনি help [এটিতে সহায়তা পেতে দৌড়াতে পারেন:

$ help [
[: [ arg... ]
    Evaluate conditional expression.

    This is a synonym for the "test" builtin, but the last argument must
    be a literal `]', to match the opening `['.

কোন পরীক্ষাগুলি সমর্থিত এবং কীভাবে তারা কাজ করে সে সম্পর্কে আরও তথ্যের জন্য আপনাকে সহায়তাটি দেখতে হবে test। আপনি যখন কমান্ডটি চালাবেন help test, আপনি একটি বিশদ তালিকা পাবেন। এগুলি সমস্ত পুনরুত্পাদন করার পরিবর্তে স্ট্রিং অপারেটরদের সম্পর্কে এখানে অংশটি রয়েছে:

      -z STRING      True if string is empty.

      -n STRING
         STRING      True if string is not empty.

      STRING1 = STRING2
                     True if the strings are equal.
      STRING1 != STRING2
                     True if the strings are not equal.
      STRING1 < STRING2
                     True if STRING1 sorts before STRING2 lexicographically.
      STRING1 > STRING2
                     True if STRING1 sorts after STRING2 lexicographically.

লক্ষ্য করুন -n STRINGএবং ঠিক STRINGএকই কাজ করুন: তারা পরীক্ষা করে যদি স্ট্রিংটি STRINGখালি না থাকে।


2
ভাল ব্যাখ্যা
সের্গেই কলডিয়াজহনি

1
: হয়তো এছাড়াও যে এই অ উদ্ধৃত ভেরিয়েবল যে সেট না, এই মত সংশ্লেষ আছে উল্লেখ paste.ubuntu.com/25831047
Sergiy Kolodyazhnyy

1
@ সার্জিইকোলোডিয়াজনি আমার ধারণা পৃথক উত্তরে এটি আরও ভাল হতে পারে। ভেরিয়েবলগুলি যা আনসেট করা নয়, বা সেট কিন্তু খালি রয়েছে, বা কেবল IFSশ্বেতস্থান রয়েছে, এটি করবে; ভেরিয়েবলগুলি যে শূন্যের পরিবর্তে একাধিক শব্দ ধারণ করে অন্য প্রভাব তৈরি করে এবং সম্পূর্ণ ভিন্ন পরীক্ষা চালানো হতে পারে। অপারেটিং হওয়ার অভিপ্রায় নিয়ে আক্ষরিক অর্থে প্রদর্শিত স্ট্রিংগুলি কেবলমাত্র সঠিকভাবে কাজ করবে যদি তাদের কোনও স্পেস বা ট্যাব না থাকে বা সেগুলি উদ্ধৃত হয়। আমি যদি এই বিষয়টিকে অ্যাক্সেসযোগ্য উপায়ে coveredেকে রাখি তবে উত্তরটি আরও দীর্ঘ এবং আরও জটিল হয়ে উঠবে। যদি আপনি উত্তর পোস্ট করার সিদ্ধান্ত নেন, তবে এটি সম্পর্কে আমাকে এখানে নির্দ্বিধায় মনে করুন!
এলিয়াহ

এলিয়াহ কাগান, আপনার উত্তরটি আরও সম্পূর্ণ এবং বিস্তারিত, যদিও ইগনাসিও ভাস্কেজ-আব্রামসের প্রতিক্রিয়া আমার প্রশ্নের জবাব দিয়েছে।
রবি কুমার

1
আমি মনে করি আপনি এটির কারণটি মিস করছেন এবং এটি এমন হতে হবে: যদি তা না হয় [ "$var" ]তবে কখনই এটি পরীক্ষার মতো ব্যবহারযোগ্য হবে না কারণ এটি $varপ্রসারিত হতে পারে -n
আর ..

12

[ -n ]কারণ সত্য [কমান্ড (ওরফে testকমান্ড) উপর কাজ সংখ্যা আর্গুমেন্ট তা দেওয়া হয়। যদি এটি কেবল একটি একক আর্গুমেন্ট দেওয়া হয় তবে যুক্তিটি একটি খালি স্ট্রিং হলে ফলাফল "সত্য" হয়। "-n" হল 2 টি অক্ষরযুক্ত একটি স্ট্রিং, খালি নয়, সুতরাং "সত্য"।

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