Bash

Shell腳本 - 空白並不總是這樣辨識?

  • January 7, 2016

我對 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)

以便重新評估該值,並且空格會導致該值被拆分為離散的單詞。

引用自:https://unix.stackexchange.com/questions/253885