
다음과 같은 간단한 스크립트가 있습니다. 이 스크립트에서는 함수 내의 전역 변수에 값을 할당합니다. 디버그 문을 통해 값이 변수에 할당되는 것을 명확하게 볼 수 있습니다. 그러나 마지막에 변수를 에코하면 항상 비어 있습니다.
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}"
현재 쉘 환경에서 다음과 같이 마지막으로 null 문자열로 설정되었기 때문에 사라집니다 ''
.
RECYCLEBIN=
따라서 명령문을 실행할 때 수행하는 작업은 다음과 같습니다.
echo Recyclebin:
기능적으로는 별 다를게 없는데...
echo "Recyclebin: ${RECYCLEBIN}"
...어쨌든 $RECYCLEBIN
비어있으니까요.