বাশ স্ক্রিপ্ট ত্রুটি [:! =: অমান্য অপারেটর প্রত্যাশিত


99

আমার স্ক্রিপ্টে আমি ত্রুটিটি পরীক্ষা করে দেখার চেষ্টা করছি যে প্রথম এবং একমাত্র যুক্তি -v এর সমান কিনা তবে এটি একটি optionচ্ছিক যুক্তি। আমি যদি একটি বিবৃতি ব্যবহার করি তবে আমি অ্যানারি অপারেটরের প্রত্যাশিত ত্রুটি পেতে থাকি।

এই কোড:

if [ $1 != -v ]; then
   echo "usage: $0 [-v]"
   exit
fi

সম্পাদনা করুন:

আমার আরও সুনির্দিষ্ট হওয়া উচিত: উপরের স্ক্রিপ্টের এই অংশটি একটি argumentচ্ছিক আর্গুমেন্ট পরীক্ষা করছে এবং তারপরে, যদি তর্কটি প্রবেশ করা না হয়, তবে এটি প্রোগ্রামটির বাকী অংশটি চালানো উচিত।

#!/bin/bash

if [ "$#" -gt "1" ]; then
   echo "usage: $0 [-v]"
   exit
fi

if [ "$1" != -v ]; then
   echo "usage: $0 [-v]"
   exit
fi

if [ "$1" = -v ]; then
   echo "`ps -ef | grep -v '\['`"
else
   echo "`ps -ef | grep '\[' | grep root`"
fi

... যাইহোক, আমি মনে করি আপনি চান echo "usage: $0 [-v]"; $-সক্রিয় শেল বিকল্প ফ্ল্যাগগুলি প্রদর্শন করে, বর্তমান স্ক্রিপ্টের নাম নয়।
চার্লস ডাফি

আমার সেই অংশটি ঠিক আছে, আমি এটি বর্তমান স্ক্রিপ্টের নামটি প্রদর্শন করতে চাই।
ব্যবহারকারী 3380240

4
স্ট্যাকওভারফ্লো এবং বিশেষত ব্যাশ ট্যাগে আপনাকে স্বাগতম! পরীক্ষা করে দেখুন ট্যাগ উইকি , দরকারী সরঞ্জাম ও সম্পদের জন্য মত shellcheck যা এই মত অনেক বিষয় বাতলান করবে না (যদিও সবসময় ব্যাখ্যা নয়)।
সেই অন্য লোকটি

@ user3380240, $-হয় না বর্তমান স্ক্রিপ্টের নাম। $0হয়
চার্লস ডাফি

দুঃখিত, এটি একটি টাইপ ছিল।
ব্যবহারকারী 3380240

উত্তর:


195

উক্তি!

if [ "$1" != -v ]; then

অন্যথায়, যখন $1সম্পূর্ণ শূন্য থাকে, আপনার পরীক্ষাটি হয়ে যায়:

[ != -v ]

পরিবর্তে

[ "" != -v ]

... এবং !=অকার্যকর অপারেটর নয় (এটি কেবলমাত্র একক যুক্তি গ্রহণে সক্ষম)।


9
অথবা, যদি আপনি বহনযোগ্যতার বিষয়ে উদ্বিগ্ন না হন তবে আপনি ডাবল বন্ধনী ব্যবহার করতে পারেন, যার মধ্যে পরিবর্তনশীল বিস্তৃতি উদ্ধৃত করার প্রয়োজন নেই: if [[ $1 != -v ]]; then
মাইক হল্ট

@ মাইকহোল্ট, প্রকৃতপক্ষে - আমি উপরে, প্রশ্নের একটি মন্তব্য করে এনেছি।
চার্লস ডফি

@ ড্যানিয়েলডিনিইসস, যদি IFS=1তবে [ $# -eq 1 ]এত ভাল আচরণ করে না , তবে ততক্ষণে [ "$#" -eq 1 ]ইচ্ছা মতো আচরণ করে। এটি একটি প্যাথলজিকাল কেস, অবশ্যই, তবে পছন্দ মতো সফটওয়্যার লিখতে ভাল যা তাদের পছন্দ করে না।
চার্লস ডাফি 21

-2

বা যা প্রচণ্ড ওভারকিলের মতো বলে মনে হচ্ছে, তবে এটি আসলে সরলবাদী ... সুন্দর আপনার সমস্ত ক্ষেত্রে coversাকা পড়েছে, এবং কোনও খালি স্ট্রিং বা একক উদ্বেগ নয়।

ক্ষেত্রে প্রথম আর্গটি '-v' হয়, তারপরে আপনার শর্তসাপেক্ষে করুন ps -ef, অন্যথায় সমস্ত ক্ষেত্রে ব্যবহারটি নিক্ষেপ করুন।

#!/bin/sh
case $1 in
  '-v') if [ "$1" = -v ]; then
         echo "`ps -ef | grep -v '\['`"
        else
         echo "`ps -ef | grep '\[' | grep root`"
        fi;;
     *) echo "usage: $0 [-v]"
        exit 1;; #It is good practice to throw a code, hence allowing $? check
esac

যদি '-v' আরগটি কোথায় থাকে সেদিকে খেয়াল করে না, তবে কেসটি কেবল একটি লুপের মধ্যে ফেলে দিন। এটি সমস্ত আরগগুলি হাঁটতে এবং যে কোনও জায়গায় '-v' সন্ধানের অনুমতি দেয় (যদি এটি বিদ্যমান থাকে তবে)। এর অর্থ কমান্ড লাইন আর্গুমেন্ট অর্ডার গুরুত্বপূর্ণ নয়। পূর্বনির্ধারিত হোন, যেমন উপস্থাপিত হয়েছে, চলক আরগ_ম্যাচ সেট করা আছে, সুতরাং এটি কেবল একটি পতাকা। এটি '-v' আরগের একাধিক ইভেন্টের জন্য অনুমতি দেয়। '-V' এর অন্যান্য সমস্ত উপস্থিতি যথেষ্ট সহজে উপেক্ষা করা যায়।

#!/bin/sh

usage ()
 {
  echo "usage: $0 [-v]"
  exit 1
 }

unset arg_match

for arg in $*
 do
  case $arg in
    '-v') if [ "$arg" = -v ]; then
           echo "`ps -ef | grep -v '\['`"
          else
           echo "`ps -ef | grep '\[' | grep root`"
          fi
          arg_match=1;; # this is set, but could increment.
       *) ;;
  esac
done

if [ ! $arg_match ]
 then
  usage
fi

তবে, যুক্তির একাধিক ঘটনাকে মঞ্জুরি দিন এমন পরিস্থিতিতে ব্যবহার করা সুবিধাজনক:

$ adduser -u:sam -s -f -u:bob -trace -verbose

আমরা আর্গুমেন্টের ক্রম সম্পর্কে চিন্তা করি না, এমনকি একাধিক-যুক্তিগুলিকেও অনুমতি দিই। হ্যাঁ, এটি অনুমতি দেওয়াও সহজ বিষয়:

$ adduser -u sam -s -f -u bob -trace -verbose

$*এই প্রসঙ্গে ব্যবহার করা উচিত নয়: এটি আইটেমগুলিকে স্ট্রিংয়ের সাথে যুক্ত করে যা উভয় স্ট্রিং-বিভক্ত এবং গ্লোব-প্রসারিত; এর বিপরীতে "$@", যা আইটেমগুলিকে তাদের যথাযথ মূল মানগুলি রেখে দেয়। এবং আপনি কিছু উদ্ধৃতি অনুপস্থিত, যা শেলচেক নেট.ইনুসারে ধরা পড়বে (উইকির পৃষ্ঠায় লিঙ্কযুক্ত সতর্কতার সাথে এই বিবরণগুলি গুরুত্বপূর্ণ কেন তা বর্ণনা করে)।
চার্লস ডাফি

একটি দৃ concrete় উদাহরণ হিসাবে বিবেচনা করুন -U'Bob Barker'; for arg in $*এটি পৃথক আইটেম হিসাবে -UBobএবং তারপরে দেখবে Barker; যদিও একক স্ট্রিং হিসাবে for item in "$@"দেখতে পাবেন -UBob Barker
চার্লস ডাফি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.