2011-02-18 3 views
2

필자는 셸 스크립트의 함수에 파일의 변수 설정을 읽고 쓰려고했습니다. 이 일을하는 더 깨끗한 방법이 있는지 궁금합니다. 나는 특히 기존의 일치하는 부분을 삭제하고 파일의 끝에 다시 쓰는 부분을 좋아하지 않는다. 이 작업을 수행하는 더 좋은 방법이 있습니까? 감사. 당신은 당신이 어쨌든 변수에 설정하는 문자열을 반환 sed를 사용할 수 있기 때문에변수 값을 읽고 파일에 논리를 향상 시키려면 어떻게해야합니까?

fnReadTestSetting() 
{ 
#$1 is the variable to be read from the testsettings.ini file 
grep $1 $MAIN_FOLDER/testsettings.ini >$MAIN_FOLDER/temp.ini 
if [ $? -eq 0 ]; then 
    sed -i "s|$1=||" $MAIN_FOLDER/temp.ini 
    TEST_VALUE=`cat $MAIN_FOLDER/temp.ini` 
    export $1=$TEST_VALUE 
fi 
rm $MAIN_FOLDER/temp.ini 
return 
} 


fnWriteTestSetting() 
{ 
#$1 is the variable and value to be written to the testsettings.ini file in the format VARIABLE_NAME=VALUE 
if [ ! -e $MAIN_FOLDER/testsettings.ini ]; then 
    touch $MAIN_FOLDER/testsettings.ini 
fi 
SETTING_NAME=`echo $1 | awk -F = '{print $1}'` 
grep $SETTING_NAME $MAIN_FOLDER/testsettings.ini &>/dev/null 
if [ $? -eq 0 ]; then 
    sed -i "/^$SETTING_NAME/d" $MAIN_FOLDER/testsettings.ini 
    echo "$1" >> $MAIN_FOLDER/testsettings.ini 

else 
    echo "$1" >> $MAIN_FOLDER/testsettings.ini 
fi 
return 
} 
+1

'$ string'의 앞부분에서'$ substring'의 가장 짧은 일치를 제거하기 위해'VARIABLE ='을 없애기 위해'awk'를 생성하는 대신에'$ {string # substring} 비트; 여기에 몇 가지 작은 세부 정보 : http://tldp.org/LDP/abs/html/refcards.html – sarnold

+0

나는 이걸 읽어 보았습니다 : \t LINE ='grep $ 1 testsettings.ini'; \t KEY = $ 1 "="; \t VALUE = $ {LINE # $ KEY}; \t 내보내기 $ 1 = $ VALUE; IP_ADDRESS = 10.0.0.1 값을 가진 함수에 IP를 전달할 때 실패했습니다. – fzkl

답변

3

은 좀 개선을 만들었습니다 :

당신은 설정을 읽을 나오지 하나를 사용할 수 있습니다. 이렇게하면 tmp 파일에 쓰는 시간을 절약 할 수 있습니다. 왜 $ 1을 수출하려했는지 확신 할 수 없습니다. 존재하지 않는 경우는 어쨌든 생성되기 때문에

fnReadTestSetting() 
{ 
    #$1 is the variable to be read from the testsettings.ini file 
    sed -n "s/^$1=\(.*$\)/\1/p" $MAIN_FOLDER/testsettings.ini 
} 

쓰기를 들어, 파일을 터치 할 필요가 없습니다. 설정 이름을 찾는 데 awk가 필요하지 않습니다. grep을 종료 코드를 명시 적으로 확인하는 대신 if 문에서 조건으로 사용할 수도 있습니다. 대체 (삭제 및 에코) 대신 단일 sed를 사용하십시오.

fnWriteTestSetting() 
{ 
    #$1 is the variable and value to be written to the testsettings.ini file in the format VARIABLE_NAME=VALUE 
    SETTING_NAME=${1%%=*} 
    if grep -sq "^${SETTING_NAME}=" $MAIN_FOLDER/testsettings.ini 
    then 
    sed -i "s/^${SETTING_NAME}=.*$/$1/" $MAIN_FOLDER/testsettings.ini 
    else 
    echo "$1" >> $MAIN_FOLDER/testsettings.ini 
    fi 
    return 
} 

는 업데이트 :

%%=*= 후 모든 것을 삭제합니다. %% 운영자에 대한 추가 정보를 위해 string manipulation guide를 살펴 :

${string%%substring}는 $ 문자열의 뒷면에서 하위 문자열 $의 긴 일치하는 항목을 삭제합니다.

+0

몇 가지 질문 1) sed는 $ 1에 대한 일치 여부와 관계없이 종료 상태 0을 반환합니다. 파일에 "variable ="을 grepping하지 않고 변수가 파일에 정의되어 있는지 확인하는 더 나은 방법이 있다고 생각하십니까? 2) SETTING_NAME = $ {1 %% = *}의 작동 방식을 설명해 주시겠습니까? 전에는 본 적이 없어요. 감사. – fzkl

+0

무엇이 사용되고 있는지 모르겠지만'export'는'$ 1'에 들어있는 변수 이름의 값을 설정합니다. 'declare'는 함수에 지역 변수를 만들 것이고'eval'은 보안상의 위험이 있기 때문에 사용할 수 없습니다. 'a = ':; pwd ;:'; eval $ a = foo'는'pwd'를 평가합니다 (이것은 악의적 인 것일 수 있습니다). '신고'와 '수출'은 오류를 만들어 내고 따라서 안전합니다. 방금 출시 된 Bash 4.2는 전역 변수를 함수에 선언하기 위해'declare -g'를 사용합니다. 나는이 '수출'트릭을 전에 보지 못했다. 한 가지 부작용은 수출이 바람직하지 않을 수 있다는 것입니다. –

0

는 정말 임시 파일에 sed -i을 사용할 필요가 없습니다. 또한 정규식이 .ini 파일 (http://en.wikipedia.org/wiki/INI_file)에 허용되는 등호 기호의 양쪽에있는 공백을 차지한다고 생각하지 않습니다. 정규 표현식은 여전히 ​​깨끗하고 임시 파일에 쓰지 않는 것이 훨씬 더 깨끗합니다. 읽기 기능을 비 - 부작용으로 만듭니다.

관련 문제