쉘 스크립트 - 공백이 항상 인식되지는 않습니까?

쉘 스크립트 - 공백이 항상 인식되지는 않습니까?

스크립트를 실행할 때 bash가 공백을 해석하는 방법이 혼란스럽습니다. 마지막으로, 조직에서 사용하는 소프트웨어가 포함된 csv 파일로 제공되는 스크립트를 원하며, 이 정보를 얻기 위해 Python 스크립트를 호출하여 이러한 프로그램의 CVE를 반환해야 합니다.

내 파일은 다음과 같지만 줄이 500개가 넘습니다.

"CRYSTAL REPORTS 2008";"SAP";"reporting software";;"Mr. Smith"

다음과 같이 내 스크립트에 입력됩니다.

$ getcve.sh < test.csv

이 작은 스크립트를 실행할 때 단어 수와 관련하여 이상한 결과가 나타납니다(다른 파일에 저장하기 위해 Python 스크립트의 출력을 반복하는 데 사용하고 싶습니다).

Read from file
Source: CVE-2010-2590 CVE-2010-3032 
Words in variable: 2
CVE-2010-2590 CVE-2010-3032 
Words processed: 1

그러나 스크립트에서 "SAP CRYSTAL REPORTS 2008"을 하드코드하면 개수가 예상한 값으로 변경됩니다.

 Hardcoded query
 Query: "SAP CRYSTAL REPORTS 2008"
 Source: CVE-2010-2590 CVE-2010-3032
 Words in variable: 2
 CVE-2010-2590
 CVE-2010-3032
 Words processed: 2

스크립트 자체는 다음과 같습니다.

#!/bin/bash
clear
echo "Hardcoded query"
query='"SAP CRYSTAL REPORTS 2008"'
echo "Query: "$query
var2=$(python3 $HOME/cve-search/bin/search_fulltext.py -q "$query"  | tr '\n' ' ')
echo "Source: "$var2
i=0
echo "Words in variable: "$(echo "$var2"|wc -w)
for cve in $var2
do
    echo $cve
    i=$[ $i+1 ]
done
echo "Words processed: "$i

echo
echo "Read from file"
IFS_OLD=$IFS
IFS=";"
while read title firm desc version manager
do
    query='"'$(echo $firm $title $version | tr -d '"')'"'
    var3=$(python3 $HOME/cve-search/bin/search_fulltext.py -q "$query" | tr '\n' ' ')
    echo "Source: "$var3
    i=0
    echo "Words in variable: "$(echo "$var3"|wc -w)
    for cve in $var3
    do
        echo $cve
        i=$[ $i+1 ]
    done
    echo "Words processed: "$i
done
IFS=$IFS_OLD

파일에서 읽을 때 하드코딩된 쿼리와 동일한 결과를 얻을 수 있는 방법이나 방법이 있습니까?

나는 그것을 시도하면서 우연히 이것을 발견했고(쉘 스크립팅은 나에게 새로운 것입니다) 이 이상한 결과는 나를 괴롭혔습니다 ^^"

도움을 주셔서 미리 감사드립니다 :)

답변1

귀하의 질문은 내 의견에서 나온 것입니다 IFS=";". 이 수정은 for 루프에 영향을 미칠 것입니다.

노력하다:

IFS_OLD=$IFS
IFS=";"
while read title firm desc version manager
do
    query='"'$(echo $firm $title $version | tr -d '"')'"'
    var3=$(python3 $HOME/cve-search/bin/search_fulltext.py -q "$query" | tr '\n' ' ')
    echo "Source: "$var3
    i=0
    echo "Words in variable: "$(echo "$var3"|wc -w)
    IFS=" "
    for cve in $var3
    do
        echo $cve
        i=$[ $i+1 ]
    done
    IFS=";"
    echo "Words processed: "$i
done
IFS=$IFS_OLD

답변2

공백이 포함된 문자열을 변수에 넣으면 문자열은 다음으로 확장됩니다.하나사용했을 때의 가치와 같습니다 for i in $var3. 그러나 를 사용하면 echo $var3출력에 공백이 포함되며 wc -w이러한 공백도 계산됩니다.

루프를 수정해야 합니다.

for cve in $(echo $var3)

값이 다시 평가되고 공백으로 인해 값이 개별 단어로 분할됩니다.

관련 정보