2013-05-10 59 views
1

我正在處理一些文件夾,每個文件夾代表一本書的頁面。例如。 「Iliad-001」將是Book = Iliad,Page = 001。變量賦值左側的參數替換 - BASH和陣列

我想循環遍歷所有的文件夾,爲每本書創建一個數組,併爲每個找到的頁面添加一個條目到數組中,這樣我就可以在腳本的末尾輸入echo ${Iliad[@]},它會給我它找到的所有頁面的不錯列表。

我遇到的問題是將數值添加到具有動態名稱的數組中。下面是我認爲是直觀的(但顯然不是右)代碼:

for j in */; do 
     vol_name=$(basename "$j" | sed 's/\(.*\)-[0-9]*/\1/') 
     page_name=$(basename "$j" | sed 's/.*-\([0-9]*\)/\1/') 
     $vol_name+=("$page_name") 
done  

這將返回:

syntax error near unexpected token `"$page_name"' 

如果我改變變量賦值給這個$vol_name+="("$page_name")"我得到一點點接近:

Iliad+=(001): command not found 
+0

請參見[BashFAQ/006](http://mywiki.wooledge.org/BashFAQ/006) – 2013-05-10 21:46:40

回答

1

我能夠使用eval工作。

順便說一句,你不需要運行sed

#! /bin/bash 

for j in */; do 
     j=$(basename "$j") 
     vol_name=${j%-*} 
     page_name=${j#*-} 
     eval "$vol_name+=('$page_name')" 
done  
echo ${Iliad[@]} 
+0

精彩的回答!我想我不太瞭解eval的功能。而且我甚至沒有想到能夠在替換期間刪除這些額外的字符。非常感謝! – Seth 2013-05-10 21:39:00

+2

@Seth:參見'help eval'。它將該參數解釋爲shell命令。這是一個非常強大但也是危險的內建。 – choroba 2013-05-10 22:56:10