我正在编写一个简单的脚本来生成给定长度的a和b的所有组合(比如说10)。我希望能够在命令行上执行此操作(我知道如果我只是将所有内容放在bash脚本文件中并执行它,这相当容易)。但是,我想知道是否有可能没有任何额外的文件。这是我到目前为止所做的:
n=10;
for i in `seq 1 1 $n`; do
echo "for a$i in {a..b}; do ";
done;
echo -n "echo ";
for i in `seq 1 1 $n`; do
echo -n '$'"a$i"; done;
echo;
for i in `seq 1 1 $n`; do
echo "done;";
done
(为了便于阅读,我对代码进行了格式化,但实际上它只是从一个提示符开始运行)
这给了我以下输出:
for a1 in {a..b}; do
for a2 in {a..b}; do
for a3 in {a..b}; do
for a4 in {a..b}; do
for a5 in {a..b}; do
for a6 in {a..b}; do
for a7 in {a..b}; do
for a8 in {a..b}; do
for a9 in {a..b}; do
for a10 in {a..b}; do
echo $a1$a2$a3$a4$a5$a6$a7$a8$a9$a10
done;
done;
done;
done;
done;
done;
done;
done;
done;
done;
这很好。如果我复制它并将其粘贴回命令行,它就像一个魅力,并给我结果。
问题是如何使用初始脚本执行此操作,无需复制粘贴,也无需将任何内容重定向到文件。
我已经尝试在脚本周围粘贴$()但是这给了我“找不到命令”,因为它不是真正的命令而是内置的bash。在此之前我曾尝试将eval放在某个地方,但我只是不断收到更多错误。我有点卡住了,所以任何帮助都会非常感激。
(顺便说一句,重申一点,我这样做或多或少只是为了学习bash更多 - 这就是为什么我不想将输出重定向到文件然后执行该文件。我知道怎么做那部分,但我不知道如何从命令行执行此操作)
答案 0 :(得分:21)
你需要使用eval,$()会给你一个字符串。
eval $( echo echo foo )
另一种选择是坚持使用子shell并将其传递给bash:
(echo echo foo) | /bin/bash
答案 1 :(得分:2)
您可以for i in $(seq $n)
代替seq 1 1 $n
。
您可以执行for ((i=1; i<=$n; i++))
并避免调用外部实用程序。
你可以做到这一点(稍微有点hacky 只有一个循环 ):
$ a=A; b=B; n=4; s=''; for ((i=1;i<=n;i++)); do s+="{$a..$b}"; done; eval echo "''" $s"$'\n'"
或者这个(非常hacky 没有任何循环 ):
$ a=A; b=B; n=4; eval echo "''" $(printf "{$a..$b}%.0s" $(eval echo "{1..$n}"))"$'\n'"
任何一个人都能得到你:
AAAA
AAAB
AABA
AABB
ABAA
ABAB
ABBA
ABBB
BAAA
BAAB
BABA
BABB
BBAA
BBAB
BBBA
BBBB