मैंने विभिन्न कार्यों के साथ शेल स्क्रिप्ट लिखी है, जिसे मैं कमांड लाइन से इस तरह से लागू कर सकता हूं:
bash script.sh -i -b
तो वह उन दो कार्यों को चलाएगा, न कि अन्य स्क्रिप्ट में। हालांकि, मैं इस तर्क को उलटना चाहता हूं, अगर मैं बस करता हूं तो स्क्रिप्ट डिफ़ॉल्ट रूप से प्रत्येक फ़ंक्शन को चलाती है
bash script.sh
और अगर मैं -i -b
जैसे तर्क पास करता हूं तो मैं इसके बजाय उन कार्यों को छोड़ना चाहता हूं। किसी भी मदद की सराहना की जाती है!
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
स्वीकार करता है, अन्य सभी स्विच के परिणामस्वरूप *)
मामले में त्रुटि को संभाला जाएगा।
आप डिफ़ॉल्ट रूप से बुलाए जाने वाले कार्यों की सूची से आइटम को ब्लैक लिस्ट कर सकते हैं। कुछ इस तरह:
#!/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
संबंधित सवाल
नए सवाल
bash
बैश कमांड शेल के लिए लिखी गई लिपियों के बारे में प्रश्नों के लिए। त्रुटियों / वाक्यविन्यास त्रुटियों के साथ शेल स्क्रिप्ट के लिए, कृपया यहां पोस्ट करने से पहले शेलचेक प्रोग्राम (या वेब शेलचेक सर्वर पर https://shellcheck.net) के साथ उन्हें जांचें। बैश के इंटरैक्टिव उपयोग के बारे में सवाल स्टैक ओवरफ्लो की तुलना में सुपर उपयोगकर्ता पर ऑन-टॉपिक होने की अधिक संभावना है।