不带大括号扩展的循环

不带大括号扩展的循环

我正在使用基于 Bash 的黑盒 CLI,但我不完全确定我可以使用哪些东西。大括号扩展不起作用,并且随之而来的是我在不显式列出参数的情况下执行循环的能力,这是我一开始就试图通过循环来避免的事情。

for x in {1..5}
do
    for y in {a..c}
    do
    echo $HOME$x$y
    done
done

如何在不使用大括号扩展且不显式列出参数的情况下运行类似的操作?环境变量也应该起作用,这就是我$HOME在示例中附加随机变量的原因。

请随意提供不同的替代方案(AWK、sed),因为我不完全确定什么有效,什么无效。

答案1

你最好jot按照评论使用。这是一个(不太漂亮)的awk实现。

#!/usr/bin/awk -f
BEGIN{
    for(i=1;i<5;i++)
        for(j=97;j<100;j++)
            printf "%s%d%c ",ENVIRON["HOME"],i,j;                               
    print;
}

或者(您也可以使用将 shell 变量分配给变量-v的选项)awkawk

#!/bin/bash
awk -f /dev/fd/3 3<< EOF                                                                                                                                                                                    
BEGIN{
    for(i=1;i<5;i++)
        for(j=97;j<100;j++)
            printf "$HOME%d%c ",i,j;
    print;
}
EOF

答案2

如果您确定运行了bash,则可能未启用大括号扩展。

通过使用检查它

echo $-
himBHs

在我使用的 shell 中,B设置了该选项,表示启用了大括号扩展。

您可以使用以下命令之一设置大括号扩展:

set -o braceexpand
set -B

在这种情况下,我不需要循环字母或数字:

echo {1..5}{a..c}
1a 1b 1c 2a 2b 2c 3a 3b 3c 4a 4b 4c 5a 5b 5c

或通过使用禁用它

set +o braceexpand
set +B

导致

echo {1..5}{a..c}
{1..5}{a..c}

相关内容