Bash
eval을 사용하는 경우
수색…
소개
맨 먼저 : 당신이하고있는 일을 알아라! 둘째, eval
사용을 피하는 동안, 코드를 사용하면 코드가 깨끗해진다.
평가 사용하기
예를 들어, $@
의 내용을 주어진 변수의 내용으로 설정하는 다음을 고려하십시오.
a=(1 2 3)
eval set -- "${a[@]}"
이 코드는 앞서 언급 한 옵션 파서의 출력에 $@
를 설정하기 위해 종종 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
를 사용할 때마다 eval이 필요합니다.
-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
와 일치하지 않기 때문에 무한 루프로 들어갑니다.
Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow