다음과 같은 간단한 스크립트가 있습니다. 이 스크립트에서는 함수 내의 전역 변수에 값을 할당합니다. 디버그 문을 통해 변수에 값이 할당된 것을 확실히 볼 수 있습니다. 그러나 최종적으로 변수를 에코하면 항상 비어 있습니다.
function getValue()
{
local key=$1
local configFile=$2
keyValuePair="$(egrep "$key" "$configFile")"
if [ ! "$?" -eq 0 ]
then
echo "Cannot find the value for the specifed key"
return 1;
fi
value="$(cut -d"=" -f"2" <<< "$keyValuePair")"
echo "$value"
return 0;
}
function configuer()
{
if [ ! -f "$RMCFGFILE" ]
then
echo "Cannot file RMGCFG file."
return 1;
fi
#Recyclebin configuration
value=$(getValue "recyclebin" $RMCFGFILE)
if [ ! "$?" -eq 0 ]
then
echo "$value"
return 1;
fi
RECYCLEBIN="$value" **#### I am assigning here**
return 0;
}
RECYCLEBIN=
RMCFGFILE="/home/sas/.rm.cfg"
LOCALEFILE=""
CONFIG_RESULT=$(configuer)
if [ ! "$?" -eq 0 ]
then
echo "$CONFIG_RESULT"
exit 1;
fi
echo "Configuration success"
eval echo "Recyclebin: ${RECYCLEBIN}" **##No value**
여기서 무슨 일이 벌어지고 있는지 아는 사람이 있나요?
답변1
당신이 기대하는 것은:
CONFIG_RESULT=$(configuer)
값을 할당하는 $RECYCLEBIN
이유는 다음과 같습니다.
RECYCLEBIN="$value"
... configuer()
함수에서요. 이런 기능이 있군요하다값을 할당하지만 해당 값은 해당 값 을 설정한 하위 쉘이 $RECYCLEBIN
지속되는 동안에만 유지됩니다 . 그럴 것이다$(
)
아니요상위 셸의 환경에 변경 사항을 적용합니다. 여기서 호출합니다. 때를:
eval echo "Recyclebin: ${RECYCLEBIN}"
eval
모든 인수를 공백으로 구분된 문자열로 구문 분석하고 결과를 셸 명령으로 실행하려고 시도합니다. 따라서 현재 쉘 환경에서는 빈 문자열 "${RECYCLEBIN}"
로 설정되기 때문에 사라집니다 . 예를 들면 다음과 같습니다.''
RECYCLEBIN=
따라서 이 명령문이 실행될 때 수행되는 작업은 다음과 같습니다.
echo Recyclebin:
이는 기능적으로는 다음과 다르지 않습니다.
echo "Recyclebin: ${RECYCLEBIN}"
...어쨌든 $RECYCLEBIN
비어있으니까요.