Эхо-комбинации со специальным символом в качестве элементов

У меня есть небольшой скрипт, который использует возможность эха для генерации комбинаций элементов. Это кусок кода,

set={1,2,3,4}
group=3
for ((i=0; i<$group; i++));
do
  repetition=$set$repetition
done

bash -c "echo "$repetition""

Это работает нормально, проблема возникает, когда я хочу, чтобы набор состоял из некоторых специальных символов, таких как запятые, круглые скобки и т. Д. Я пробовал с scapes, но это не похоже на работу, что-то вроде

set={(,),\,,=}

Любая подсказка о том, как этого добиться?

2 ответа

Решение

Вам нужно процитировать и убежать:

set={1,2,3,"\'4\'"}

Обратите внимание, что он работал с {1,2,3,4} потому что это цифры. Для строк также необходимо указать: {1,2,3,'a'}

$ echo {1,2,3,'a'}{1,2,3,'a'}
11 12 13 1a 21 22 23 2a 31 32 33 3a a1 a2 a3 aa

И тогда побег должен обрабатывать исполнение bash -c вместе со значениями.


Из ваших комментариев ваш окончательный сценарий:

set={"\(","\)","\,"}
group=3
for ((i=0; i<$group; i++));
do
  repetition=$set$repetition
done

bash -c "echo "$repetition""

Когда я выполняю это, я получаю это, хорошо!

$ ./a
((( (() ((, ()( ()) (), (,( (,) (,, )(( )() )(, ))( ))) )), ),( ),) ),, ,(( ,() ,(, ,)( ,)) ,), ,,( ,,) ,,,

В то время как ответ @fedorqui - правильный путь, здесь приведена более подробная информация для полноты. Вы знаете, что специальные символы должны быть экранированы, но \ is, сам по себе специальный символ, поэтому его тоже нужно экранировать, поскольку вы передаете его другому экземпляру bash.

Итак, когда у вас есть set={(,)} в вашем скрипте ваш скрипт выдаст синтаксическую ошибку из-за круглых скобок. Как только вы избежите их как set={\(,\)} ваш сценарий в порядке с ними, но уже расширил их к тому времени, как вы передаете их bash -c который вместо этого увидит set={( )} и подавиться этим, выдавая ту же синтаксическую ошибку:

$ set={\(,\)}; echo Parent: "$set";  bash -c "echo Child1: "$set""
Parent: {(,)}
bash: -c: line 0: syntax error near unexpected token `('
bash: -c: line 0: `echo Child1: {(,)}'

Очевидное решение состоит в том, чтобы избежать обратной косой черты, чтобы они проходили правильно. Однако побег приводит к тому, что персонаж теряет свои особые способности, поэтому \ остановит его от выхода из скобок:

$ set={\\(,\\)};
bash: syntax error near unexpected token `('

Итак, вернемся к исходной точке. Что вам нужно сделать, это избежать побега, который избегает побега 1:

$ set={\\\(,\\\)}
$ echo "Parent3: $set"
Parent3: {\(,\)}
$ bash -c "echo Child3 "$set""
Child3 ( )

Здесь дочернему экземпляру наконец передается то, что ему нужно увидеть: {\(,\)}, Таким образом, хотя в таких случаях нет необходимости использовать кавычки, они действительно значительно облегчают вашу жизнь:


1 Попробуйте сказать это 5 раз быстро.

Другие вопросы по тегам