Bash
जब eval का उपयोग करना है
खोज…
परिचय
सबसे पहले और सबसे महत्वपूर्ण: जानिए कि आप क्या कर रहे हैं! दूसरे, जबकि आपको eval
का उपयोग करने से बचना चाहिए, यदि इसका उपयोग क्लीनर कोड के लिए करता है, तो आगे बढ़ें।
एवल का उपयोग करना
उदाहरण के लिए, निम्नलिखित पर विचार करें जो किसी दिए गए चर की सामग्री में $@
की सामग्री सेट करता है:
a=(1 2 3)
eval set -- "${a[@]}"
इस कोड को अक्सर aforementioned विकल्प पार्सर्स के आउटपुट में $@
सेट करने के लिए getopt
या getopts
साथ होता है, हालांकि, आप इसका उपयोग एक साधारण pop
फ़ंक्शन बनाने के लिए भी कर सकते हैं जो चर पर चुपचाप और सीधे परिणाम को स्टोर किए बिना कर सकते हैं। मूल चर:
isnum()
{
# is argument an integer?
local re='^[0-9]+$'
if [[ -n $1 ]]; then
[[ $1 =~ $re ]] && return 0
return 1
else
return 2
fi
}
isvar()
{
if isnum "$1"; then
return 1
fi
local arr="$(eval eval -- echo -n "\$$1")"
if [[ -n ${arr[@]} ]]; then
return 0
fi
return 1
}
pop()
{
if [[ -z $@ ]]; then
return 1
fi
local var=
local isvar=0
local arr=()
if isvar "$1"; then # let's check to see if this is a variable or just a bare array
var="$1"
isvar=1
arr=($(eval eval -- echo -n "\${$1[@]}")) # if it is a var, get its contents
else
arr=($@)
fi
# we need to reverse the contents of $@ so that we can shift
# the last element into nothingness
arr=($(awk <<<"${arr[@]}" '{ for (i=NF; i>1; --i) printf("%s ",$i); print $1; }'
# set $@ to ${arr[@]} so that we can run shift against it.
eval set -- "${arr[@]}"
shift # remove the last element
# put the array back to its original order
arr=($(awk <<<"$@" '{ for (i=NF; i>1; --i) printf("%s ",$i); print $1; }'
# echo the contents for the benefit of users and for bare arrays
echo "${arr[@]}"
if ((isvar)); then
# set the contents of the original var to the new modified array
eval -- "$var=(${arr[@]})"
fi
}
Getopt के साथ Eval का उपयोग करना
हालांकि फंक्शन जैसे pop
लिए eval की आवश्यकता नहीं हो सकती है, लेकिन जब भी आप getopt
उपयोग करते हैं तो यह आवश्यक है:
निम्नलिखित कार्य पर विचार करें जो एक विकल्प के रूप में -h
को स्वीकार करता है:
f()
{
local __me__="${FUNCNAME[0]}"
local argv="$(getopt -o 'h' -n $__me__ -- "$@")"
eval set -- "$argv"
while :; do
case "$1" in
-h)
echo "LOLOLOLOL"
return 0
;;
--)
shift
break
;;
done
echo "$@"
}
eval
set -- "$argv"
बिना set -- "$argv"
-h --
उत्पन्न करता है -h --
वांछित (-h --)
बजाय और बाद में अनंत लूप में प्रवेश करता है क्योंकि -h --
मेल नहीं खाता --
या -h
।