मैंने विभिन्न कार्यों के साथ शेल स्क्रिप्ट लिखी है, जिसे मैं कमांड लाइन से इस तरह से लागू कर सकता हूं:

bash script.sh -i -b

तो वह उन दो कार्यों को चलाएगा, न कि अन्य स्क्रिप्ट में। हालांकि, मैं इस तर्क को उलटना चाहता हूं, अगर मैं बस करता हूं तो स्क्रिप्ट डिफ़ॉल्ट रूप से प्रत्येक फ़ंक्शन को चलाती है

bash script.sh

और अगर मैं -i -b जैसे तर्क पास करता हूं तो मैं इसके बजाय उन कार्यों को छोड़ना चाहता हूं। किसी भी मदद की सराहना की जाती है!

0
mlenthusiast 1 जुलाई 2019, 20:51

2 जवाब

सबसे बढ़िया उत्तर

उन दो तर्कों को लागू करने के लिए:

  1. यदि कोई तर्क नहीं है, तो सभी फ़ंक्शन चलाएँ
  2. पारित प्रत्येक तर्क के लिए, कुछ फ़ंक्शन निष्पादन को छोड़ दें

आप इसे इस तरह कर सकते हैं:

#!/bin/bash

function func_i {
  echo "I am i."
}

function func_b {
  echo "I am b."
}

function main {

  # Check if there are no arguments, run all functions and exit.

  if [ $# -eq 0 ]; then
    func_i
    func_b
    exit 0
  fi

  # Parse arguments -i and -b, marking them for no execution if they are passed to the script.

  proc_i=true
  proc_b=true

  while getopts "ib" OPTION; do
      case $OPTION in
      i)
          proc_i=false
          ;;
      b)
          proc_b=false
          ;;
      *)
          echo "Incorrect options provided"
          exit 1
          ;;
      esac
  done

  # Execute whatever function is marked for run.

  if $proc_i; then func_i; fi
  if $proc_b; then func_b; fi
}

main "$@"

कुछ स्पष्टीकरण:

$# स्क्रिप्ट को दिए गए तर्कों की संख्या देता है। यदि $# 0 के बराबर है, तो स्क्रिप्ट को कोई तर्क नहीं दिया गया।

getops स्विच -i और -b स्वीकार करता है, अन्य सभी स्विच के परिणामस्वरूप *) मामले में त्रुटि को संभाला जाएगा।

1
Alexandre Juma 2 जुलाई 2019, 00:14

आप डिफ़ॉल्ट रूप से बुलाए जाने वाले कार्यों की सूची से आइटम को ब्लैक लिस्ट कर सकते हैं। कुछ इस तरह:

#!/bin/bash

list='a b c d e f g h i'

# define some functions
for name in $list; do
        eval "func_$name() { echo func_$name called with arg \$1; }"
done

# black list items from list
for x; do
        list=$(echo "$list" | tr -d ${x#-})
done

for name in $list; do
        func_$name $name
done

लेकिन स्पष्ट रूप से ऐसा कुछ करने के लिए और अधिक समझ में आता है:

$ cat script.sh 
#!/bin/bash

list='a b c d e f g h i'
test $# = 0 && set -- $list # set default list of functions to call

# define some function
for name in $list; do
        eval "func_$name() { echo func_$name called with arg \$1; }"
done

for name; do
        func_$name $name
done
$ bash ./script.sh 
func_a called with arg a
func_b called with arg b
func_c called with arg c
func_d called with arg d
func_e called with arg e
func_f called with arg f
func_g called with arg g
func_h called with arg h
func_i called with arg i
$ bash ./script.sh c g
func_c called with arg c
func_g called with arg g
1
William Pursell 2 जुलाई 2019, 00:39