簡體   English   中英

Bash,數組和空白導致奇怪的行為

[英]Strange behaviour with Bash, Arrays and empty spaces

問題:編寫bash腳本,我試圖將csv文件中的產品列表導入數組:

#!/bin/bash
    PRODUCTS=(`csvprintf -f "/home/test/data/input.csv" -x | grep "col2" | sed 's/<col2>//g' | sed 's/<\/col2>//g' | sed -n '1!p' | sed  '$ d' | sed 's/    //g'`)

    echo ${PRODUCTS[@]}

在交互式外殼中,結果/輸出看起來很完美,如下所示:

burger
special fries
juice - 300ml

當我在bash腳本中使用完全相同的命令時,即使使用bash -x script.sh調試,在echo ${PRODUCTS[@]} ,數組的結果是位於/ home / test / data的所有文件名/和:

burger
special
fries
juice
- 
300ml

該數組正在接收目錄列表並弄亂了換行符。 在交互式外殼程序(單個命令行)中不會發生這種情況。 有人知道該如何解決嗎?

查看csvprintf的文檔,您正在將csv轉換為XML,然后使用正則表達式進行解析。 通常這是一個非常糟糕的主意。

您可能需要安裝csvkit,然后才能執行

csvcut -c prod input.csv | sed 1d

或者,您可以使用CSV解析器模塊隨附的語言。 例如,紅寶石

ruby -rcsv -e 'CSV.read("input.csv", :headers=>true).each {|row| puts row["prod"]}'

無論使用哪種方法,都可以使用此結構將結果讀取到bash數組中

mapfile -t products < <(command to extract the product data)

然后,打印數組元素:

for prod in "${products[@]}"; do echo "$prod"; done
# or
printf "%s\n" "${products[@]}"

數組擴展周圍的引號很關鍵。 如果丟失,您將在每行看到一個單詞。


提示:不要在外殼程序中使用ALLCAPS變量名:將變量名留給外殼程序。 有一天,您將編寫PATH=something ,然后想知道為什么腳本損壞了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM