bash: выполнение вывода скрипта в виде скрипта

Я пишу простой скрипт для генерации всех комбинаций 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 builtin. Я пробовал поставить eval где-то раньше, но я просто продолжаю получать ошибки. Я немного застрял, поэтому любая помощь будет очень признательна.

(кстати, просто чтобы повторить, я делаю это более или менее, чтобы просто узнать bash больше-вот почему я не хочу перенаправлять вывод в файл, а затем выполнять этот файл. Я знаю, как это сделать, но я не знаю, как это сделать из командной строки)

2 ответов


вам нужно использовать eval, $ () дает вам строку.

eval $( echo echo foo )

другой вариант-вставить в подсеть и передать ее в Баш:

(echo echo foo) | /bin/bash

можно сделать 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