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