2011-02-16 73 views
4

我在写一个简单的脚本来生成给定长度的a和b的所有组合(比如说10)。我希望能够在命令行上执行此操作(如果我只是将所有内容都放入bash脚本文件并执行它,我知道这很容易)。但是,我想知道是否有可能没有任何额外的文件。这是我到目前为止有: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而已 - 这就是为什么我不想将输出重定向到文件然后执行该文件。我知道如何做这个部分,但我不知道如何从命令行执行)

+1

`n = 10;海峡=; for((i = 0; i <$ n; ++ i));做str + ='{a..b}';完成; eval echo $ str` – bobbogo 2011-02-16 14:48:47

回答

13

你需要使用一个eval,$()给你一个字符串。

eval $(echo echo foo) 

另一种选择是粘成一个子shell和管道它一个bash:

(echo echo foo) | /bin/bash 
+0

这是我得到的: user @ host:/ tmp $ eval $(n = 10; for i seq 1 1 $ n`; do echo“for a $ i in {a .. b}; do“; done; echo -n”echo“;因为我在`seq 1 1 $ n`; do echo -n'$'”a $ i“; done; echo; for i in`seq 1 1 $ n`; do echo“done;”; done) bash:语法错误:意外的文件结尾 – vmpstr 2011-02-16 14:29:30

2

你可以做for i in $(seq $n)而不是seq 1 1 $n

你可以做for ((i=1; i<=$n; i++))并避免调用外部工具。

你可以做到这一点(与只有一个循环稍微哈克):

$ a=A; b=B; n=4; s=''; for ((i=1;i<=n;i++)); do s+="{$a..$b}"; done; eval echo "''" $s"$'\n'" 

或本(高度哈克没有任何循环):

$ 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