シェルスクリプト - 空白は常に認識されていませんか?

シェルスクリプト - 空白は常に認識されていませんか?

スクリプトの実行時に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

おすすめ記事