Сценарий оболочки – пробелы не всегда распознаются как таковые?

Я смущен тем, как bash интерпретирует пробелы при выполнении сценария. В конце концов, мне нужен сценарий, который загружается csv-файлом, содержащим программное обеспечение, используемое организацией, и он должен возвращать CVE для этих программ, вызывая скрипт python для получения этой информации.

Мой файл будет выглядеть так, но с более чем 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 

Есть ли уловка или метод получения тех же результатов, что и жесткий кодированный запрос при чтении из файла?

Я наткнулся на это, немного поиграв (сценарий оболочки для меня новый), и этот странный результат беспокоит меня ^^ "

Заранее спасибо за вашу помощь 🙂

Ваша проблема исходит от 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) 

так что значение переоценивается и пробелы вызывают разделение значения на дискретные слова.