2013-05-10 58 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