【问题标题】:How to reuse brace expansion?如何重用大括号扩展?
【发布时间】:2021-09-01 16:14:38
【问题描述】:

我需要清理一堆目录并将一些文件放入其中,例如,

#!/bin/sh
rm -rfv {a,b,c}
mkdir {a,b,c}
touch {a,b,c}/foo.txt

这很好用,但我想避免在太多地方硬编码目录。理想情况下,我想做这样的事情:

#!/bin/sh
DIRS=a,b,c
rm -rfv {$DIRS}
mkdir {$DIRS}
touch {$DIRS}/foo.txt

这可以使用大括号扩展吗?

【问题讨论】:

    标签: sh brace-expansion


    【解决方案1】:

    这很好用

    首先,必须说大括号扩展不是 POSIX shell 的一部分。你有#!/bin/sh shebang 和大括号扩展在许多平台上都不起作用。使用#!/bin/bash 或其他支持您使用的功能的shell。

    如何重用大括号展开?

    只需使用 bash 数组即可。

    dirs=({a,b,c})
    # or dirs=(a b c) ...
    mkdir "${dirs[@]}"
    foos=(); for i in "${dirs[@]}"; do foos+=("$i"/foo.txt); done
    touch "${foos[@]}"
    # or
    printf "%s/foo.txt\n" "${dirs[@]}" | xargs -d'\n' touch
    

    这可以使用大括号扩展吗?

    你可以eval 一切,像往常一样eval 离“邪恶”只有一个字母。

    eval "anything {$DIRS}/foo.tx"
    

    注意:最好在脚本中使用小写变量,导出变量使用大写。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-07
      相关资源
      最近更新 更多