আমি কীভাবে কোনও শেল স্ক্রিপ্টে সহায়তা পদ্ধতি যুক্ত করতে পারি?


128

কোনও -hবৈশিষ্ট্যটি শেল স্ক্রিপ্টে পাস করা হয়েছে কিনা তা আমি কীভাবে পরীক্ষা করব ? কোনও ব্যবহারকারী কল করলে আমি একটি সহায়তা বার্তা প্রদর্শন করতে চাই myscript.sh -h


প্রাসঙ্গিক উদাহরণ: স্ট্যাকওভারফ্লো
প্রশ্নগুলি

উত্তর:


173

বাশের জন্য এখানে একটি উদাহরণ রয়েছে:

usage="$(basename "$0") [-h] [-s n] -- program to calculate the answer to life, the universe and everything

where:
    -h  show this help text
    -s  set the seed value (default: 42)"

seed=42
while getopts ':hs:' option; do
  case "$option" in
    h) echo "$usage"
       exit
       ;;
    s) seed=$OPTARG
       ;;
    :) printf "missing argument for -%s\n" "$OPTARG" >&2
       echo "$usage" >&2
       exit 1
       ;;
   \?) printf "illegal option: -%s\n" "$OPTARG" >&2
       echo "$usage" >&2
       exit 1
       ;;
  esac
done
shift $((OPTIND - 1))

এটি কোনও ফাংশনের অভ্যন্তরে ব্যবহার করতে:

  • "$FUNCNAME"পরিবর্তে ব্যবহার করুন$(basename "$0")
  • local OPTIND OPTARGকল করার আগে যোগ করুনgetopts

1
আমি এটি একটি ফাংশনের অভ্যন্তরে চেষ্টা করছি, তবে যখন আমি ফাংশনটি চালানোর চেষ্টা করি তখন আমি এই ত্রুটিটি "বেসনাম: অবৈধ বিকল্প - 'বি'" পেতে পারি। দেখে মনে হচ্ছে এটি basenameনেতৃস্থানীয় ড্যাশটির সাথে "-বাশ" দেওয়ার চেষ্টা করছে ।
মরগান এস্টেস

5
পাশাপাশি একটি ফাংশন ব্যবহার "$FUNCNAME"না "$0"। এছাড়াও, যোগ করুনlocal OPTIND OPTARG
গ্লেন জ্যাকম্যান

ধন্যবাদ। FUNCNAMEকাজ করে। আমার একক ফাইলে আমার সমস্ত ফাংশন রয়েছে তাই এটি অন্যের জন্য দরকারী কিছুতে প্রসারিত করার জন্য এটি উপযুক্ত।
মরগান এস্টেস

5
@ সিগুর, আপনার ব্যবহৃত "$usage" প্রতিটি জায়গার উদ্ধৃতি নিশ্চিত করুন ।
গ্লেন জ্যাকম্যান 24'16

1
কিসের shift $((OPTIND - 1))জন্য?
hpaknia

45

শেল স্ক্রিপ্টের প্রথম আর্গুমেন্টটি ভেরিয়েবল হিসাবে উপলব্ধ $1, তাই সহজ বাস্তবায়ন হবে

if [ "$1" == "-h" ]; then
  echo "Usage: `basename $0` [somestuff]"
  exit 0
fi

তবে অনুভা কী বলল।


ধন্যবাদ @MarkBooth, টাইপো সংশোধন (প্লাস উদ্ধৃতির মধ্যে মোড়ানো দ্বারা উন্নতি)
SEB

আপনি মোড়কে একটা অভ্যাস করা উচিত তাহলে [[...]] কন্ডিশন একটি পরিবর্তনশীল, উৎস একটি খারাপ পার্সিং এড়াতে জন্য: github.com/bahamas10/bash-style-guide#bashisms
JREAM

2
হ্যাঁ, যদিও ওপ ব্যাশ নির্দিষ্ট করে নি, এবং [এটি পসিক্স-অনুবর্তী সংস্করণ।
সেব

দ্রষ্টব্য - ভিতরে ব্যবহারের জন্য function: আপনি যদি আপনার ফাংশনটি চালানোর পরে শেলটি শেষ করতে না চান তবে আপনার exit 0সাথে প্রতিস্থাপন করা উচিত return। (আমি এটি এর আগে 😂 করেছি)
আলোকসজ্জার

29

এটি একটি অংশ যা আমি এটি একটি ভিএনসি সার্ভার শুরু করতে ব্যবহার করি

#!/bin/bash
start() {
echo "Starting vnc server with $resolution on Display $display"
#your execute command here mine is below
#vncserver :$display -geometry $resolution
}

stop() {
echo "Killing vncserver on display $display"
#vncserver -kill :$display
}

#########################
# The command line help #
#########################
display_help() {
    echo "Usage: $0 [option...] {start|stop|restart}" >&2
    echo
    echo "   -r, --resolution           run with the given resolution WxH"
    echo "   -d, --display              Set on which display to host on "
    echo
    # echo some stuff here for the -a or --add-options 
    exit 1
}

################################
# Check if parameters options  #
# are given on the commandline #
################################
while :
do
    case "$1" in
      -r | --resolution)
          if [ $# -ne 0 ]; then
            resolution="$2"   # You may want to check validity of $2
          fi
          shift 2
          ;;
      -h | --help)
          display_help  # Call your function
          exit 0
          ;;
      -d | --display)
          display="$2"
           shift 2
           ;;

      -a | --add-options)
          # do something here call function
          # and write it in your help function display_help()
           shift 2
           ;;

      --) # End of all options
          shift
          break
          ;;
      -*)
          echo "Error: Unknown option: $1" >&2
          ## or call function display_help
          exit 1 
          ;;
      *)  # No more options
          break
          ;;
    esac
done

###################### 
# Check if parameter #
# is set too execute #
######################
case "$1" in
  start)
    start # calling function start()
    ;;
  stop)
    stop # calling function stop()
    ;;
  restart)
    stop  # calling function stop()
    start # calling function start()
    ;;
  *)
#    echo "Usage: $0 {start|stop|restart}" >&2
     display_help

     exit 1
     ;;
esac

এটি কিছুটা অদ্ভুত যে আমি একটি আলাদা ক্ষেত্রে স্টার্ট স্টপ পুনরায় আরম্ভ করেছি তবে এটি কাজ করা উচিত


যদি আপনি -d তে একটি খালি বিকল্প দেন; এটা কি অসীম লুপ হবে না?
জেরোবনে

আপনি সাহায্যকারী ফাংশনে কেন 1 থেকে প্রস্থান করবেন?
জিনটাইমস

17

দ্রুত একক বিকল্প সমাধানের জন্য, ব্যবহার করুন if

যদি আপনার কাছে কেবলমাত্র চেক করার জন্য একটি একক বিকল্প থাকে এবং এটি সর্বদা প্রথম বিকল্প ( $1) থাকে তবে সহজ সমাধানটি ifএকটি পরীক্ষা ( [) সহ হয়। উদাহরণ স্বরূপ:

if [ "$1" == "-h" ] ; then
    echo "Usage: `basename $0` [-h]"
    exit 0
fi

নোট করুন যে পোস্টিক্সের সামঞ্জস্যের =পাশাপাশি কাজ করবে ==

কেন উদ্ধৃতি $1?

$1উদ্ধৃতিতে আবশ্যক হওয়ার কারণটি হ'ল যদি না থাকে $1তবে শেলটি চালানোর চেষ্টা করবে if [ == "-h" ]এবং ব্যর্থ হবে কারণ ==যখন দুটি প্রত্যাশা ছিল তখন কেবল একটি একক যুক্তি দেওয়া হয়েছিল:

$ [ == "-h" ]
bash: [: ==: unary operator expected

আরও জটিল ব্যবহারের জন্য getoptবাgetopts

হিসাবে প্রস্তাব দ্বারা অন্যদের , আপনি একটি একক সহজ বিকল্প চেয়ে বেশি থাকে, অথবা প্রয়োজন হলে একটি আর্গুমেন্ট গ্রহণ করতে আপনার বিকল্প, তাহলে আপনি স্পষ্টভাবে ব্যবহারের অতিরিক্ত জটিলতা জন্য যেতে হবে getopts

একটি দ্রুত রেফারেন্স হিসাবে, আমি 60 সেকেন্ডের getopts টিউটোরিয়ালটি পছন্দ করি

আপনি getoptশেলটি বিল্ট শেলের পরিবর্তে প্রোগ্রামটি বিবেচনা করতে চাইতে পারেন getopts। এটি দীর্ঘ বিকল্পগুলি এবং অপশন যুক্তির পরে বিকল্পগুলি (উদাহরণস্বরূপ কেবল foo a b c --verboseনা বরং foo -v a b c) ব্যবহারের অনুমতি দেয় । এই স্ট্যাকওভারফ্লো উত্তরটি কীভাবে জিএনইউ ব্যবহার করতে হয় তা ব্যাখ্যা করে getopt

জেফবায়ার্নস উল্লেখ করেছেন যে মূল লিঙ্কটি মারা গিয়েছিল তবে ধন্যবাদ যেভাবে ফিরে যন্ত্রটি সংরক্ষণাগারভুক্ত করেছিল।


ধন্যবাদ! আমি এখন এক বছর যাবত সুখের সাথে গোটপট ব্যবহার করছি, তবে আমিও গোটোপটটির দিকে নজর দেব।
tttppp

1
দুঃখের বিষয়, 60 সেকেন্ড গিওপটস টিউটোরিয়ালটির লিঙ্কটি মারা গেছে; দেখে মনে হচ্ছে বাশক্রেসেন্সার ডটকম আর নেই। এখানে একটি লিঙ্ক আছে Wayback মেশিন এর সংস্করণ
জেফবির্নেস

5

ব্যাশের গিওপ্ট সুবিধা ব্যবহার করা আরও ভাল। আরও সহায়তার জন্য দয়া করে এই প্রশ্নোত্তরটি দেখুন: ল্যাশ এবং শর্ট কমান্ড লাইনের বিকল্পগুলি পেতে ব্যাশ শেল স্ক্রিপ্টে গোটপট ব্যবহার করুন


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