खोज…
वाक्य - विन्यास
function
कीवर्ड के साथ एक फ़ंक्शन को परिभाषित करें:function f {
}
()
साथ एक फ़ंक्शन को परिभाषित करें:f(){
}
function
कीवर्ड और()
दोनों के साथ एक फ़ंक्शन को परिभाषित करें:function f(){
}
सरल कार्य
helloWorld.sh
#!/bin/bash
# Define a function greet
greet ()
{
echo "Hello World!"
}
# Call the function greet
greet
स्क्रिप्ट चलाने में, हम अपना संदेश देखते हैं
$ bash helloWorld.sh
Hello World!
ध्यान दें कि फ़ंक्शंस के साथ फ़ाइल सोर्स करना उन्हें आपके वर्तमान बैश सत्र में उपलब्ध कराता है।
$ source helloWorld.sh # or, more portably, ". helloWorld.sh"
$ greet
Hello World!
आप कुछ गोले में एक फ़ंक्शन export
कर सकते हैं, ताकि यह बाल प्रक्रियाओं के संपर्क में हो।
bash -c 'greet' # fails
export -f greet # export function; note -f
bash -c 'greet' # success
तर्कों के साथ कार्य
helloJohn.sh
:
#!/bin/bash
greet() {
local name="$1"
echo "Hello, $name"
}
greet "John Doe"
# running above script
$ bash helloJohn.sh
Hello, John Doe
यदि आप किसी भी तरह से तर्क को संशोधित नहीं करते हैं, तो इसे
local
चर पर कॉपी करने की कोई आवश्यकता नहीं है - बसecho "Hello, $1"
।आप फ़ंक्शन के अंदर तर्कों का उपयोग करने के लिए
$1
,$2
,$3
और इतने पर उपयोग कर सकते हैं।नोट: 9
$10
से अधिक तर्क के लिए काम नहीं करेगा (बैश इसे $ 1 0 के रूप में पढ़ेगा), आपको${10}
,${11}
और इतने पर करने की आवश्यकता है।$@
किसी फ़ंक्शन के सभी तर्कों को संदर्भित करता है:#!/bin/bash foo() { echo "$@" } foo 1 2 3 # output => 1 2 3
नोट: आपको व्यावहारिक रूप से हमेशा
"$@"
आसपास दोहरे उद्धरण चिह्नों का उपयोग करना चाहिए, जैसे यहां।उद्धरणों को छोड़ने से शेल वाइल्डकार्ड का विस्तार होगा (तब भी जब उपयोगकर्ता विशेष रूप से उनसे बचने के लिए उद्धृत करता है) और आम तौर पर अवांछित व्यवहार और संभावित रूप से सुरक्षा समस्याओं का भी परिचय देता है।
foo "string with spaces;" '$HOME' "*" # output => string with spaces; $HOME *
डिफ़ॉल्ट तर्कों के लिए
${1:-default_val}
। उदाहरण के लिए:#!/bin/bash foo() { local val=${1:-25} echo "$val" } foo # output => 25 foo 30 # output => 30
एक तर्क का उपयोग करने के लिए
${var:?error message}
आवश्यकता होती हैfoo() { local val=${1:?Must provide an argument} echo "$val" }
किसी फ़ंक्शन से मान लौटाएं
बैश में return
स्टेटमेंट सी-फंक्शंस की तरह कोई वैल्यू नहीं लौटाता है, इसके बजाय यह फंक्शन को रिटर्न स्टेटस से बाहर निकाल देता है। आप इसे उस फ़ंक्शन की निकास स्थिति के रूप में सोच सकते हैं।
आप समारोह से एक मूल्य के वापस जाने के लिए चाहते हैं, तो करने के लिए मूल्य भेज stdout
इस तरह:
fun() {
local var="Sample value to be returned"
echo "$var"
#printf "%s\n" "$var"
}
अब, यदि आप करते हैं:
var="$(fun)"
fun
का आउटपुट $var
में संग्रहीत किया जाएगा।
झंडे और वैकल्पिक मापदंडों को संभालना
गेटटॉप बिल्डिन का उपयोग फ़ंक्शंस और वैकल्पिक मापदंडों को समायोजित करने वाले कार्यों को लिखने के लिए किया जा सकता है। यह कोई विशेष कठिनाई प्रस्तुत नहीं करता है लेकिन किसी को उचित रूप से गेटटॉप्स द्वारा छुआ जाने वाले मूल्यों को संभालना पड़ता है । एक उदाहरण के रूप में, हम एक फेल्विथ फ़ंक्शन को परिभाषित करते हैं जो stderr पर एक संदेश लिखता है और कोड 1 के साथ बाहर निकलता है या -x
विकल्प के पैरामीटर के रूप में आपूर्ति की गई एक मनमाना कोड है:
# failwith [-x STATUS] PRINTF-LIKE-ARGV
# Fail with the given diagnostic message
#
# The -x flag can be used to convey a custom exit status, instead of
# the value 1. A newline is automatically added to the output.
failwith()
{
local OPTIND OPTION OPTARG status
status=1
OPTIND=1
while getopts 'x:' OPTION; do
case ${OPTION} in
x) status="${OPTARG}";;
*) 1>&2 printf 'failwith: %s: Unsupported option.\n' "${OPTION}";;
esac
done
shift $(( OPTIND - 1 ))
{
printf 'Failure: '
printf "$@"
printf '\n'
} 1>&2
exit "${status}"
}
इस फ़ंक्शन का उपयोग निम्नानुसार किया जा सकता है:
failwith '%s: File not found.' "${filename}"
failwith -x 70 'General internal error.'
और इसी तरह।
ध्यान दें कि प्रिंटफ के लिए , चर को पहले तर्क के रूप में उपयोग नहीं किया जाना चाहिए। यदि प्रिंट करने के लिए संदेश में एक चर की सामग्री शामिल है, तो किसी को इसे प्रिंट करने के लिए %s
स्पेसियर का उपयोग करना चाहिए, जैसे
failwith '%s' "${message}"
किसी फ़ंक्शन का एक्ज़िट कोड उसके अंतिम कमांड का एक्ज़िट कोड होता है
एक मेजबान है अगर जाँच करने के लिए इस उदाहरण समारोह पर विचार करें:
is_alive() {
ping -c1 "$1" &> /dev/null
}
यह फ़ंक्शन पहले फ़ंक्शन पैरामीटर द्वारा निर्दिष्ट होस्ट को एक एकल पिंग भेजता है। ping
का आउटपुट और एरर आउटपुट दोनों को /dev/null
रीडायरेक्ट किया जाता है, इसलिए फ़ंक्शन कभी भी कुछ भी आउटपुट नहीं करेगा। लेकिन ping
कमांड में सफलता पर निकास कोड 0 होगा, और विफलता पर गैर-शून्य। चूंकि यह फ़ंक्शन का अंतिम (और इस उदाहरण में, एकमात्र) कमांड है, फ़ंक्शन के निकास कोड के लिए ping
के निकास कोड का पुन: उपयोग किया जाएगा।
यह तथ्य सशर्त बयानों में बहुत उपयोगी है।
उदाहरण के लिए, यदि मेजबान graucho
ऊपर है, तो इसे ssh
कनेक्ट करें:
if is_alive graucho; then
ssh graucho
fi
एक और उदाहरण: बार-बार जाँच जब तक मेजबान graucho
ऊपर है, और फिर इसे ssh
साथ कनेक्ट करें:
while ! is_alive graucho; do
sleep 5
done
ssh graucho
फ़ंक्शन परिभाषा प्रिंट करें
getfunc() {
declare -f "$@"
}
function func(){
echo "I am a sample function"
}
funcd="$(getfunc func)"
getfunc func # or echo "$funcd"
आउटपुट:
func ()
{
echo "I am a sample function"
}
एक फ़ंक्शन जो मापदंडों को नामित करता है
foo() {
while [[ "$#" -gt 0 ]]
do
case $1 in
-f|--follow)
local FOLLOW="following"
;;
-t|--tail)
local TAIL="tail=$2"
;;
esac
shift
done
echo "FOLLOW: $FOLLOW"
echo "TAIL: $TAIL"
}
उदाहरण उपयोग:
foo -f
foo -t 10
foo -f --tail 10
foo --follow --tail 10