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