Itution {! Var_name + x the বিকল্পটির অর্থ কী?


10

আমি একটি স্ক্রিপ্ট পেয়েছি যার একটি ফাংশন রয়েছে যা ভেরিয়েবল সেট করা আছে কিনা তা পরীক্ষা করে তবে আমি এটি খুব ভাল বুঝতে পারি না।

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

এই প্রতিস্থাপনের সাথে ঠিক কী ঘটে?


সম্পর্কিত $ {! FOO} এবং zsh
нιηসнιη

উত্তর:


17

ইন bashশেল, ${!var}একটি পরিবর্তনশীল অপ্রত্যক্ষ্যতার হয়। এটি যার ভেরিয়েবলের নাম রাখা আছে তার মান পর্যন্ত প্রসারিত হয় $var

ভেরিয়েবল এক্সপেনশন ${var+value}হ'ল একটি পসিক্স এক্সপেনশন যা প্রসারিত হয় valueযদি ভেরিয়েবলটি varসেট করা থাকে তবে (এর মান খালি থাকুক বা না থাকুক) no

এগুলির সংমিশ্রণটি, যার নামটি ভেরিয়েবল সেট ${!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}}"

(আউটপুট হিসাবে খালি লাইন)


প্রশ্নের ফাংশনটি ছোট করা যেতে পারে could

check_if_variable_is_set () { [ -n "${!1+x}" ]; }

অথবা এমনকি:

check_if_variable_is_set () { [ -v "$1" ]; }

অথবা এমনকি:

check_if_variable_is_set()[[ -v $1 ]]

ভেরিয়েবলের নামের -vএকটি bashপরীক্ষা কোথায় রয়েছে যা নামযুক্ত ভেরিয়েবল সেট করা থাকলে সত্য হবে এবং অন্যথায় মিথ্যা।


সম্ভবত, এটি লেখা যেতে পারে:

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:]] বর্ণমালার অক্ষরের জন্য চেক করবে যখন কিছু শেল কেবল তাদের পরিবর্তনশীলে সেট বহনযোগ্য অক্ষর থেকে বর্ণানুক্রমিক অক্ষর গ্রহণ করে)


পৃথিবীতে এর চেয়ে সম্পূর্ণ আর কিছুই নেই। আপনি এটির জন্য একটি কুকির প্রাপ্য।
করিম মানাউল

@ করিম মানাউইল এই কুকির এক তৃতীয়াংশ স্টাফানে যান যদিও :-)
কুসালানন্দ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.