কমান্ড বিকল্পগুলি পড়তে 'কেস $ 1 ইন' ব্যবহার করে - ড্যাশের পরে একাধিক পতাকা, এবং অস্বাভাবিক পতাকাগুলি পরিচালনা করা?


1

আমি একটি bash স্ক্রিপ্ট তৈরি করছি যা দীর্ঘ বিকল্প এবং ছোট পতাকা উভয় ব্যবহার করে। যেহেতু আমি দীর্ঘ বিকল্প চাই, আমি ব্যবহার করতে পারছি না getopts। আমি নিম্নলিখিত কোড ব্যবহার করার চেষ্টা করেছিলাম:

while test -n "$1"; do
  case "$1" in
        -o|--override)  NO_CHANGE=yes;shift 1;;
        -r|--reset)     OV_RESET=yes;shift 1;;
        -h|--help)      hthemehelp;shift 1;;
        *)              break;;
  esac
done

যখন আমি এটি পছন্দ করি তখন এটি কাজ করে myscr -o -r অথবা myscr -h, কিন্তু যখন আমি চেষ্টা করি myscr -or প্রোগ্রাম শুধু এটি স্বাভাবিক আচরণ রান, এবং চলমান myscr -or -h এটি পায় আগে লুপ exits -h। প্রতিস্থাপন করা হচ্ছে break সঙ্গে continue শুধু কারণ myscr -or এবং myscr -or -h ফাসি.


আপনি কিভাবে ছোট কথা বলছেন? আমার আছে একটি #!/bin/sh সম্পূর্ণরূপে পরামিতি জুড়ে যে বাস্তবায়ন বাস্তবায়নের জন্য 2 শেল স্ক্রিপ্ট লাগে যে লাইব্রেরি। যদি আপনি চান আমি এটি আপনার জন্য pastebin পারে।
bgStack15

আমার উদ্দেশ্য কোন বহিরাগত লাইব্রেরি ব্যবহার এবং এক ফাইল সবকিছু অন্তর্ভুক্ত করা হয়।
Ethan McTague

উত্তর:


1

আকারের জন্য এই চেষ্টা করুন:

#!/bin/bash
pleasereset=1
while test -n "$1"; do
   pleaseshift=0
   [[ pleasereset -eq 1 ]] && thisvar=$1 && pleasereset=0;
   case "$thisvar" in
      -o*|--override) echo "override!"; pleaseshift=1;;
      -r*|--reset) echo "reset!"; pleaseshift=1;;
      -h*|--help) echo "help!"; pleaseshift=1;;
      *) break ;;
   esac
   if [[ "$pleaseshift" = "1" ]];
   then
      testvar=${thisvar##-}
      if [[ ${#testvar} -gt 1 ]] && [[ ! ${thisvar} = --* ]];
      then
         thisvar=-$( echo "$testvar" | cut -c 2- )
      else
         shift 1; pleasereset=1;
      fi
   fi
done

উল্লেখ্য যে কোনও নির্দিষ্ট ক্ষেত্রে মেলে না এমন প্রথম প্যারামিটারে, পরামিতি পার্সিং বন্ধ হবে, তাই a ./foobar.sh -o --help -s -r প্রক্রিয়া হবে না -r। এই পরিবর্তন দ্বারা সামঞ্জস্য করা যাবে *) break;; ত্রুটি হ্যান্ডলিং লাইন, কিন্তু রাখা মনে রাখবেন pleaseshift=1!


এই কোডের জন্য আমি কিভাবে আমার স্ক্রিপ্টে ক্রেডিট দিতে পারি?
Ethan McTague

আমি সাধারণত শুধু একটি #Reference: http://superuser.com/questions/778549/using-case-1-in-to-read-command-options-multiple-flags-after-dash-and-handl/ লাইন বা কিছু।
bgStack15

0

সম্ভবত আপনি চান লাইনে যোগ করতে যথেষ্ট:

while test -n "$1"; do
  case "$1" in
        -or|-ro)        OV_RESET=yes;NO_CHANGE=yes;shift 1;;
        -o|--override)  NO_CHANGE=yes;shift 1;;
        -r|--reset)     OV_RESET=yes;shift 1;;
        -h|--help)      hthemehelp;shift 1;;
        *)              break;;
  esac
done

অথবা, আরো জটিল, আপনি স্থাপন করতে পারেন case সঙ্গে একটি ফাংশন ব্লক shift 1 যে ব্লক আউট কিন্তু এখনও ভিতরে ভিতরে।
জন্য দ্বিগুণ অপশন ( -or, -oh, যে দীর্ঘ এক হয় না, আপনি recursively থেকে প্রতিটি চিঠি জন্য একই ফাংশন কল করতে পারেন case *)... যদি আপনি শুধু প্রক্রিয়া করে থাকেন তবে আপনাকে একটি পতাকা প্রয়োজন $1 একটি দীর্ঘ বিকল্প হিসাবে। এই ক্ষেত্রে যদিও আপনি ভুল স্ক্রিপ্টের কারণে আপনার স্ক্রিপ্টটি খারাপ আচরণে প্রকাশ করুন (যেমন, আমি যদি লিখি -overrider I will process -ও-ভি-আর-ডি` ...)

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