스크립트를 실행할 때 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)
값이 다시 평가되고 공백으로 인해 값이 개별 단어로 분할됩니다.