代码之家  ›  专栏  ›  技术社区  ›  dreamlax

壳中的技巧支撑展开

  •  8
  • dreamlax  · 技术社区  · 16 年前

    touch {quick,man,strong}ly
    

    扩展到

    touch quickly manly strongly
    

    quickly manly strongly ,但是否可以动态创建扩展?例如,以下内容说明了我想做的事情,但由于扩展顺序的原因,它不起作用:

    TEST=quick,man,strong    #possibly output from a program
    echo {$TEST}ly
    

    有没有办法做到这一点?如果需要的话,我不介意约束自己去痛击。我还希望避免循环。扩展应作为任何任意程序的完整参数提供(即程序不能为每个文件调用一次,只能为所有文件调用一次)。我知道 xargs 但我希望这一切都能从外壳上完成。

    4 回复  |  直到 15 年前
        1
  •  19
  •   lhunath    16 年前

    ... 使用它有太多的错误 eval . 你所要求的只有在 评估 , 你会怎么做 不必求助于bash bug central即可轻松实现。

    使用数组!只要你需要 倍数 项目 数据类型,您需要(或, (使用)数组。

    TEST=(quick man strong)
    touch "${TEST[@]/%/ly}"
    

    这正是您想要的,没有其他建议中引入和隐藏的数千个bug和安全问题。

    • "${foo[@]}" :展开名为的数组 foo 通过展开每个元素,正确引用。别忘了引语!
    • ${foo/a/b} a 通过 b % 意味着 $ 在正则表达式中。
    • ly
        2
  •  3
  •   paxdiablo    16 年前

    在bash中,可以执行以下操作:

    #!/bin/bash
    TEST=quick,man,strong
    eval echo $(echo {$TEST}ly)
    #eval touch $(echo {$TEST}ly)
    

        3
  •  1
  •   calandoa    11 年前

    Zsh可以轻松做到这一点:

    TEST=quick,man,strong
    print ${(s:,:)^TEST}ly
    

    变量内容以逗号分隔,然后每个元素分布到大括号周围的字符串中:

    quickly manly strongly
    
        4
  •  0
  •   njsf    16 年前

    $ TEST=quick,man,strong
    $ touch $(eval echo {$TEST}ly)
    
    推荐文章