【问题标题】:Parameter Substitution on Left Side of Variable Assignment - BASH and Arrays变量赋值左侧的参数替换 - BASH 和数组
【发布时间】:2013-05-05 14:49:26
【问题描述】:

我正在处理一些文件夹,每个文件夹代表一本书的一页。例如。 “Iliad-001”将是 Book=Iliad,Page=001。

我想遍历所有文件夹,为每本书创建一个数组,并为找到的每一页向该数组添加一个条目,这样我就可以在我的脚本末尾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

【问题讨论】:

  • 请看BashFAQ/006
  • 您的 $( 内联嵌套代码已被 sed 的正则表达式终止,因此它告诉您 -[0-9]*\/1/')\npage_name 是无效令牌。您的 sed 命令需要更强大的分隔符。

标签: arrays bash variable-assignment variable-substitution


【解决方案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[@]}

【讨论】:

  • 精彩的答案!我想我真的不明白 eval 是做什么的。而且我什至没有考虑在替换过程中能够删除那些额外的字符。非常感谢!
  • @Seth:见help eval。它将参数解释为 shell 命令。这是一个非常强大但也很危险的内置函数。
【解决方案2】:

试试这个

declare $vol_name+=( "$page_name" )

【讨论】:

    猜你喜欢
    • 2012-06-29
    • 2012-07-06
    • 1970-01-01
    • 1970-01-01
    • 2013-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多