Shell 脚本 - 空格并不总是被识别为这样?

Shell 脚本 - 空格并不总是被识别为这样?

我对 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

从文件读取时是否有技巧或方法可以获得与硬编码查询相同的结果?

我通过尝试了一下偶然发现了这个(shell 脚本对我来说是新的),这个奇怪的结果让我很困扰 ^^"

预先感谢您的帮助 :)

答案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)

以便重新评估该值,并且空格导致该值被分割成离散的单词。

相关内容