@ एसएलएम में पहले से ही पॉसिक्स डॉक्स शामिल हैं - जो बहुत सहायक हैं - लेकिन वे वास्तव में इस पर विस्तार नहीं करते हैं कि इन मापदंडों को एक दूसरे को प्रभावित करने के लिए कैसे जोड़ा जा सकता है। इस फॉर्म का यहाँ कोई उल्लेख नहीं है:
${var?if unset parent shell dies and this message is output to stderr}
यह मेरा एक और जवाब है, और मुझे लगता है कि यह बहुत अच्छी तरह से दर्शाता है कि ये कैसे काम करते हैं:
sh <<-\CMD
_input_fn() { set -- "$@" #redundant
echo ${*?WHERES MY DATA?}
#echo is not necessary though
shift #sure hope we have more than $1 parameter
: ${*?WHERES MY DATA?} #: do nothing, gracefully
}
_input_fn heres some stuff
_input_fn one #here
# shell dies - third try doesnt run
_input_fn you there?
# END
CMD
heres some stuff
one
sh: line :5 *: WHERES MY DATA?
उसी से एक और उदाहरण :
sh <<-\CMD
N= #N is NULL
_test=$N #_test is also NULL and
v="something you would rather do without"
( #this subshell dies
echo "v is ${v+set}: and its value is ${v:+not NULL}"
echo "So this ${_test:-"\$_test:="} will equal ${_test:="$v"}"
${_test:+${N:?so you test for it with a little nesting}}
echo "sure wish we could do some other things"
)
( #this subshell does some other things
unset v #to ensure it is definitely unset
echo "But here v is ${v-unset}: ${v:+you certainly wont see this}"
echo "So this ${_test:-"\$_test:="} will equal NULL ${_test:="$v"}"
${_test:+${N:?is never substituted}}
echo "so now we can do some other things"
)
#and even though we set _test and unset v in the subshell
echo "_test is still ${_test:-"NULL"} and ${v:+"v is still $v"}"
# END
CMD
v is set: and its value is not NULL
So this $_test:= will equal something you would rather do without
sh: line 7: N: so you test for it with a little nesting
But here v is unset:
So this $_test:= will equal NULL
so now we can do some other things
_test is still NULL and v is still something you would rather do without
उपरोक्त उदाहरण POSIX पैरामीटर प्रतिस्थापन के सभी 4 रूपों और उनके विभिन्न :colon null
या not null
परीक्षणों का लाभ उठाता है । उपरोक्त लिंक में अधिक जानकारी है, और यहां यह फिर से है ।
एक और बात जो लोग अक्सर इस बारे ${parameter:+expansion}
में विचार नहीं करते हैं कि यह यहां के दस्तावेज़ में कितना उपयोगी है। यहाँ एक अलग जवाब से एक और अंश है :
ऊपर
यहाँ आप कुछ डिफॉल्ट सेट करेंगे और उन्हें कॉल करने के लिए प्रिंट करने की तैयारी करेंगे ...
#!/bin/sh
_top_of_script_pr() (
IFS="$nl" ; set -f #only split at newlines and don't expand paths
printf %s\\n ${strings}
) 3<<-TEMPLATES
${nl=
}
${PLACE:="your mother's house"}
${EVENT:="the unspeakable."}
${ACTION:="heroin"}
${RESULT:="succeed."}
${strings:="
I went to ${PLACE} and saw ${EVENT}
If you do ${ACTION} you will ${RESULT}
"}
#END
TEMPLATES
मध्य
यह वह जगह है जहाँ आप अपने परिणामों के आधार पर अपने प्रिंट फ़ंक्शन पर कॉल करने के लिए अन्य कार्यों को परिभाषित करते हैं ...
EVENT="Disney on Ice."
_more_important_function() { #...some logic...
[ $((1+one)) -ne 2 ] && ACTION="remedial mathematics"
_top_of_script_pr
}
_less_important_function() { #...more logic...
one=2
: "${ACTION:="calligraphy"}"
_top_of_script_pr
}
तल
अब आपको यह सब सेटअप मिल गया है, इसलिए यहां आप अपने परिणामों को निष्पादित और खींच लेंगे।
_less_important_function
: "${PLACE:="the cemetery"}"
_more_important_function
: "${RESULT:="regret it."}"
_less_important_function
परिणाम
मैं एक पल में क्यों अंदर जाऊंगा, लेकिन ऊपर चलने से निम्नलिखित परिणाम मिलते हैं:
_less_important_function()'s
प्रथम रन:
मैं आपकी माँ के घर गया और बर्फ पर डिज्नी को देखा ।
यदि आप सुलेख करते हैं तो आप सफल होंगे।
फिर _more_important_function():
मैं कब्रिस्तान गया और बर्फ पर डिज्नी को देखा।
यदि आप सुधारात्मक गणित करेंगे तो आप सफल होंगे।
_less_important_function()
फिर:
मैं कब्रिस्तान गया और बर्फ पर डिज्नी को देखा।
यदि आप उपचारात्मक गणित करते हैं तो आपको इसका पछतावा होगा।
यह काम किस प्रकार करता है:
यहाँ की प्रमुख विशेषता यह है कि conditional ${parameter} expansion.
आप किसी वैरिएबल को किसी मान पर सेट कर सकते हैं, यदि यह फ़ॉर्म का उपयोग करने पर अशक्त या अशक्त हो:
${var_name
: =desired_value}
यदि इसके बजाय आप केवल एक अस्थिर चर सेट करना चाहते हैं, तो आप छोड़ देंगे :colon
और अशक्त मान जैसा है वैसा ही रहेगा।
SCOPE पर:
आप देख सकते हैं कि उपरोक्त उदाहरण में $PLACE
और $RESULT
परिवर्तित होने के parameter expansion
बावजूद सेट होने के बावजूद _top_of_script_pr()
पहले से ही कॉल किया गया है, संभवत: इसे चलाने पर उन्हें सेट किया जा सकता है। इसका कारण यह है कि _top_of_script_pr()
यह एक ( subshelled )
फ़ंक्शन है - मैंने इसे दूसरों के लिए उपयोग किए जाने के parens
बजाय संलग्न { curly braces }
किया। क्योंकि इसे एक उपधारा में कहा जाता है, प्रत्येक चर जो इसे सेट करता है locally scoped
और जैसे ही यह अपने मूल शेल में वापस आता है, वे मान गायब हो जाते हैं।
लेकिन जब _more_important_function()
सेट $ACTION
होता है globally scoped
तो यह _less_important_function()'s
दूसरे मूल्यांकन को प्रभावित करता है $ACTION
क्योंकि _less_important_function()
सेट $ACTION
केवल के माध्यम से होता है${parameter:=expansion}.
man bash
; ब्लॉक "पैरामीटर विस्तार" की खोज करें (लगभग 28% पर)। ये असाइनमेंट उदाहरण के लिए डिफ़ॉल्ट फ़ंक्शंस हैं: "डिफ़ॉल्ट मान का उपयोग केवल तभी करें जब तक कि कोई भी सेट न किया गया हो।"