प्रतिस्थापन $ {! Var_name + x} का क्या अर्थ है?


10

मुझे एक स्क्रिप्ट मिली जिसमें एक फ़ंक्शन है जो यह जांचता है कि एक चर सेट है लेकिन मैं इसे बहुत अच्छी तरह से नहीं समझता।

check_if_variable_is_set() {
    var_name=$1
    if [ -z "${!var_name+x}" ]; then
        false
    else
        true
    fi
}

इस प्रतिस्थापन के साथ वास्तव में क्या होता है?


संबंधित $ {! FOO} और zsh
α atsнιη

जवाबों:


17

में 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:]] वर्णमाला वर्णों की जांच करेंगे जबकि कुछ गोले केवल वर्णमाला के वर्णों को उनके चर में निर्धारित पोर्टेबल वर्ण से स्वीकार करते हैं)


इससे अधिक पूर्ण पृथ्वी पर कुछ भी नहीं है। आप उसके लिए एक कुकी के लायक हैं।
करीम मनाउल

कि कुकी के @KarimManaouil एक तीसरा हालांकि :-) स्टीफन को जाता है
Kusalananda
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.