खोज…


परिचय

सबसे पहले और सबसे महत्वपूर्ण: जानिए कि आप क्या कर रहे हैं! दूसरे, जबकि आपको 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



Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow