শেল স্ক্রিপ্টে লুপ দেওয়ার সময় একাধিক শর্ত কাজ করছে না


0

আমি মাল্টি কন্ডিশন চেক করার চেষ্টা করছি অর্থাত্, ইনপুটটি খালি হওয়া উচিত নয় এবং এতে শেল স্ক্রিপ্টের লুপ থাকা অবস্থায় কেবল সংখ্যা থাকতে হবে তবে এই ক্রিয়াকলাপটি চালানোর সময় আমি একাধিক ত্রুটির মুখোমুখি হয়েছি। আমি একাধিক বিকল্প চেষ্টা করেছি এবং আমি ইউনিক্স স্ট্যাকেক্সচেঞ্জ এবং স্ট্যাক ওভারফ্লোতে পোস্ট করা এই বিষয়ে একাধিক প্রশ্ন দেখতে পাচ্ছি তবে তাদের কেউই সহায়তা করছে না কেন আমি এখানে এই প্রশ্নটি পোস্ট করছি বিকল্প 1:

while [ \( -z "$account_number" \) && \( "$account_number" =~ "^[0-9]+$" \) ];
do      printf 'Input account Number RWDEx: '
        read -r account_number
        [ -z "$account_number" ]  && echo 'Account Number cannot be empty; try again.'
done

এটি ত্রুটি নিক্ষেপ করছে [: অনুপস্থিত `] 'শর্ত এবং বন্ধনীগুলির মধ্যে স্থান সমস্যার কারণে অনেকে এই ত্রুটিটি প্রস্তাব করেছিলেন তবে এটি কার্যকর হয়নি it

বিকল্প 2:

while [[ -z "$account_number" && "$account_number" =~ "^[0-9]+$" ]]
do      printf 'Input account Number RWDEx: '
        read -r account_number
        [ -z "$account_number" ]  && echo 'Account Number cannot be empty; try again.'
done

আমি উপরে হিসাবে শর্ত দিচ্ছি এমনকি ইনপুট জিজ্ঞাসা না

দয়া করে এই সমস্যাটি সমাধানে সহায়তা করুন এবং আমি #! / বিন / ব্যাশ ব্যবহার করছি আমি এমনকি স্ক্রিপ্টটিকে # বিন্দু / বিন / ব্যাশে পরিবর্তনের চেষ্টা করেছি!


কোন উপায় আছে $account_numberউভয় খালি (হতে পারে -z) এবং ( &&) ম্যাচ ^[0-9]+$। আপনার যুক্তি ত্রুটিযুক্ত। মনে রাখবেন যে কেবলমাত্র একজন অপারেটর [অন্তর্নির্মিত yashএবং zshসমর্থন করেন =~
স্টাফেন চেজেলাস

@ স্টাফেনচাজেলাস জবাবের জন্য ধন্যবাদ আপনাকে কীভাবে আমি এই যুক্তিটি ফ্রেম করতে পারি আমাকে সাহায্য করতে পারেন
রাহুল

উত্তর:


2

শুধু ব্যবহার করুন:

#! /bin/bash -
n=
pattern='^(0+|[123456789][0123456789]*)$' # decimal integer number,
                                          # exclude 0123 octals
until [[ $n =~ $pattern ]]; do
  IFS= read -rp 'Enter a decimal number: ' n || exit # exit upon EOF
done

বা:

#! /bin/bash -
pattern='^(0+|[123456789][0123456789]*)$' # decimal integer number,
                                          # exclude 0123 octals
while true; do
  IFS= read -rp 'Enter a decimal number: ' n || exit # exit upon EOF
  if [ -z "$n" ]; then
    echo >&2 "Cannot be empty, try again"
  elif [[ ! $n =~ $pattern ]]; then
    echo >&2 "Not a decimal integer number, try again"
  else
    break
  fi  
done

বা আরও ভাল, স্ট্যান্ডার্ড shসিনট্যাক্স ব্যবহার করুন এবং তারপরে আপনার এমনকি প্রয়োজনও হবে না bash:

#! /bin/sh -
while true; do
  printf >&2 'Enter a number: '
  IFS= read -r n || exit # exit upon EOF
  case $n in
    ("")
      echo >&2 "Cannot be empty, try again";;
    (*[!0123456789]* | 0*[!0]*)
      echo >&2 "Not a decimal integer number, try again";;
    (*)
      break;; # OK
  esac
done

নোট যে [শেল অন্তর্নির্মিত। [এর bashবিপরীত zshবা yashএকটি সমর্থন করে না =~অপারেটর।

এছাড়াও, যদি আপনি করেন তবে এটি [ x && y ]পার্স করা হয়েছে cmd1 arg && cmd2 arg2, সুতরাং কেবল চালানো হয় [ xএবং যদি এটি সফল হয় তবে চালান y ]

[[ ... ]]অন্যদিকে হ'ল একটি বিশেষ শেল কনস্ট্রাক্ট (ভিতরে ksh) যা &&একটি রূপ এবং অপারেটরও।

তবে আপনি যদি লিখেন:

[[ -z $var && $var =~ ^[0-9]+$ ]]

এটি $varখালি ( -z) এবং ম্যাচ ^[0-9]+$যা উভয়ই সম্ভব নয় কিনা তা পরীক্ষা করে ।

আমি মনে করি আপনি বোঝাতে চেয়েছিলেন:

[[ -z $var || ! $var =~ ^[0-9]+$ ]]

তবে তারপরেও এটি -z $varঅপ্রয়োজনীয় যেহেতু যদি $varম্যাচ হয় ^[0-9]+$(0-9 রেঞ্জের এক বা একাধিক অক্ষর), এটি খালি থাকতে পারে না।

নোট করুন যে [0-9]বেশিরভাগ সিস্টেমে বেশিরভাগ লোকালগুলিতে যা মিলবে কম বা কম এলোমেলো, [0123456789]আপনি যদি কোনও দশমিক অঙ্ক মেলতে চান তবে ব্যবহার করুন ।

শেলগুলির মতো bash, শীর্ষস্থানীয় শূন্যগুলির সাথে সংখ্যাগুলি বাদ দেওয়া সাধারণত একটি ভাল ধারণা কারণ তাদের অষ্টাল সংখ্যা হিসাবে ব্যাখ্যা করা হয় (যেখানে 010 অর্থ 8 হিসাবে উদাহরণস্বরূপ)।

এটা তোলে দ্বারা stderr উপর লেখার অনুরোধ জানানো হবে (যেমন ব্যবহারকারী জারি করার গতানুগতিক এর bash'র read -pকরে) হিসাবে তারা কমান্ডের স্বাভাবিক আউটপুট অংশ নয় (আউটপুট আপনার স্ক্রিপ্টটি উত্পাদন করে যদি থাকে এবং আপনি উদাহরণস্বরূপ কিছু অন্যান্য কমান্ড নল করতে পারেন)।

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