Bash
Shell腳本 - 空白並不總是這樣辨識?
我對 bash 在執行腳本時如何解釋空格感到困惑。最後,我想要一個由包含組織使用的軟體的 csv 文件提供的腳本,它應該通過呼叫 python 腳本來獲取這些資訊,從而返回這些程序的 CVE。
我的文件看起來像這樣,但有超過 500 行:
"CRYSTAL REPORTS 2008";"SAP";"reporting software";;"Mr. Smith"
並且像餵給我的腳本一樣
$ getcve.sh < test.csv
當我執行這個小腳本時,我得到了關於 wordcount 的奇怪結果(我想用它來循環遍歷 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腳本對我來說是新的),這個奇怪的結果讓我很困擾^^”
預先感謝您的幫助 :)
您的問題來自
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
如果您在變數中放置一個帶有空格的字元串,那麼在使用時它將擴展為一個值,如
for i in $var3
. 但是,當您使用時echo $var3
,輸出將包含空格併wc -w
計算這些空格。您需要將循環修改為
for cve in $(echo $var3)
以便重新評估該值,並且空格會導致該值被拆分為離散的單詞。