में bashखोल, ${!var}एक चर अविवेक है। यह उस चर के मान तक विस्तृत होता है जिसका नाम अंदर रखा गया है $var।
चर विस्तार ${var+value}है एक POSIX विस्तार है कि करने के लिए फैलता valueहै, तो चर varसेट किया गया है (कोई बात नहीं करता है, तो अपने मूल्य या खाली है नहीं)।
यदि इनका नाम जिस चर में रखा गया है , ${!var+x}उसका संयोजन करने पर उनका विस्तार होगा ।x$var
उदाहरण:
$ foo=hello
$ var=foo
$ echo "${!var+$var is set, its value is ${!var}}"
foo is set, its value is hello
$ unset foo
$ echo "${!var+$var is set, its value is ${!var}}"
(आउटपुट के रूप में खाली लाइन)
प्रश्न में फ़ंक्शन को छोटा किया जा सकता है
check_if_variable_is_set () { [ -n "${!1+x}" ]; }
या और भी:
check_if_variable_is_set () { [ -v "$1" ]; }
या और भी:
check_if_variable_is_set()[[ -v $1 ]]
एक चर नाम पर -vएक bashपरीक्षा कहां होती है जो नामांकित चर सेट होने पर सही होगी, और अन्यथा झूठी।
POSIXly, यह लिखा जा सकता है:
check_if_variable_is_set() { eval '[ -n "${'"$1"'+x}" ]'; }
ध्यान दें कि उन सभी संभावित कमांड इंजेक्शन भेद्यताएं हैं यदि उस फ़ंक्शन का तर्क किसी हमलावर के नियंत्रण में हो सकता है। उदाहरण के लिए प्रयास करें check_if_variable_is_set 'a[$(id>&2)]'।
उस से बचाव के लिए, आप यह सत्यापित कर सकते हैं कि तर्क पहले एक वैध चर नाम है। चरों के लिए:
check_if_variable_is_set() {
case $1 in
("" | *[![:alnum:]_]* | [![:alpha:]_]*) false;;
(*) eval '[ -n "${'"$1"'+x}" ]'
esac
}
(ध्यान दें कि आपके स्थान में[[:alpha:]] वर्णमाला वर्णों की जांच करेंगे जबकि कुछ गोले केवल वर्णमाला के वर्णों को उनके चर में निर्धारित पोर्टेबल वर्ण से स्वीकार करते हैं)