如何在序列的 shell 大括号扩展中使用 $variable?

如何在序列的 shell 大括号扩展中使用 $variable?

我想$var in在 bash 中使用带有范围的 shell 大括号扩展。简单地说{$var1..$var2}是行不通的,所以我选择了“横向”......

以下内容有效,但有点混乱。

# remove the split files
echo rm foo.{$ext0..$extN} rm-segments > rm-segments
source rm-segments

还有更“正常”的方式吗?

答案1

您可能想尝试:

eval rm foo.{$ext0..$extN}

不确定这是否是最好的答案,但它肯定是一个。

答案2

正如您已经意识到的那样,{1..3}展开为1 2 3{foo..bar}{$foo..$bar}不触发大括号展开,后者随后展开以替换$foo$bar的值。

GNU(例如非嵌入式Linux)的后备方案是seq命令。

for x in `seq $ext0 $extN`; do rm foo.$x; done

另一种可能性。如果foo.不包含 shell 特殊字符,则为

rm `seq $ext0 $extN | sed 's/^/foo./'`

最简单的解决方案是使用 zsh,rm foo.{$ext0..$extN}你想要的东西在哪里。

答案3

    function f_over_range {
        for i in $(eval echo {$1..$2}); do
            f $i
        done
    }

    function f {
        echo $1
    }

    f_over_range 0 5
    f_over_range 00 05

笔记:

  • 使用 eval 会暴露命令注入安全风险
  • Linux 将打印“00\n01\n02..etc”,但 OSX 将打印“1\n2\n...etc”
  • 使用 seq 或 C 风格的 for 循环与大括号扩展对前导零的处理不匹配

答案4

我有以下命令可以查找根目录中的文件总数:

命令01:

 ls -dq *dog* | wc -l

我还有一个使用数字序列创建多个文件夹的命令:

命令02:

mkdir -p {0..3}

我知道根目录中有 3 个文件的名称中包含字符串“DOG”。

但我想在其他根文件夹中使用 01 命令,并计算您的名称中有多少个文件包含“DOG”,将结果存储在变量结果中,并使用此变量代替命令 02 中所示的“3”。

以下是我无法创建子文件夹 1、2 和 3 的所有可能尝试:

result=$ls -dq *dog* | wc -l) mkdir {0..$result}

result=$(ls -dq *dog* | wc -l) | mkdir {0..$result}

ls -dq *dog* | wc -l | xargs I{} mkdir {0..{}}





ls -dq *dog* | wc -l | while read file; do mkdir -p {1.."$file"}; done

但是对于上面的任何尝试,我只有两个结果:或者创建了一个名为的文件夹,{0..3}或者除了接收结果的打印之外什么也没有发生

 ls -dq *dog* | wc -l

解决如下:

看着这个答案可以建立一个能够获得所需结果的模型:

eval "mkdir -p {1..`ls -dq *dog* | wc -l`}"

虽然严格不是最合适的答案,因为我提出问题是“在内部使用变量mkdir {1 .. $variable}

相关内容