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