2016-08-11 3 views
0

에서 문자열을 비교. parameters.txt 파일의 각 행에 대한 구분자로 :을 사용하고 의 왼쪽에있는 내용을 var1에 저장하고 :의 오른쪽에있는 내용을 var2에 저장합니다. sheet_name이 저장되지 않은 경우 var1sheet_name이고 not matched이 저장 될 때 matched을 인쇄하고 싶습니다. 내가 잘못 뭐하는 거지내가 내용 다음과 같다 <code>parameters.txt</code>라는 이름의 파일이 쉘 스크립트

filename=parameters.txt 
IFS=$'\n'  # make newlines the only separator 

for j in `cat $filename` 
    do 
     var1=${j%:*} # stores text before : 
     var2=${j#*:} # stores text after : 

     if [ “$var1” == “sheet_name” ]; then 
     echo ‘matched’ 
     else 
     echo “not matched“ 
     fi 

done 

: 다음에 관계없이 항상 무엇 var1 매장 matched를 인쇄 내 코드는? 친절하게 도와주세요.

+0

여기서 'for' 루프를 사용하지 마십시오. http://mywiki.wooledge.org/BashFAQ/001 – chepner

+1

몇 가지 문제를 해결하려면 http://www.shellcheck.net을 통해 코드를 실행해야합니다. 또한 [행을 읽지 마십시오] (http://mywiki.wooledge.org/DontReadLinesWithFor)와 [배쉬 FAQ 001] (http://mywiki.wooledge.org/BashFAQ/001)을 읽고 올바르게하는 법을보십시오. 라인 단위/필드 단위 데이터를 읽습니다. –

+1

또한 따옴표는 "스마트"/ 유니 코드 따옴표이며 쉘 스크립트에서 원하는 것은 아닙니다. 표준 ASCII 큰 따옴표와 작은 따옴표를 사용하고 있는지 확인하십시오. –

답변

1

고양이는 쓸모가 없습니다. 하지만 어때요? [ shell parameter expansion ]?

while read line 
do 
if [[ "${line%:*}" = "sheet_name" ]] #double quote variables deals word splitting 
then 
    echo "matched" 
fi 
done<parameters.txt 

당신이 찾고있는 것을 정확하게 할 수 있습니다.


메시지가

[ ShellCheck ] 말한다 들어,

은 "/ 라인이 아닌 단어, 파이프를 읽기 '읽는 동안'루프로 리디렉션합니다." shellcheck에서


확인 [ this ] 참고.

0

어때요?

filename=parameters.txt 

while IFS=: read -r first second; do 
    if [ “$first” == “sheet_name” ]; then 
    echo ‘matched’ 
    else 
    echo “not matched“ 
    fi 
done < $filename 
+0

모든 경우에 대해 '일치하지 않음'을 인쇄합니다. –

+0

'=='는 [맨 페이지] (http://linux.die.net/man/1/test)에 따라'='이어야합니다. – cxw

관련 문제