Почему первое выражение не работает должным образом
- Расширение фигурной скобки выполняется перед расширением переменной.
$number1..$number2
не является допустимым выражением последовательности, поэтому все выражение остается без изменений. - После этого происходит расширение переменной, в результате чего получается выражение
{1..3}
(учитывая, что number1=1
и number2=3
).
Почему второе выражение имеет значение
Ваш второй пример работает так же, за исключением того, что результат раскрытия переменной ({1..3}
) снова передается в Bash через eval
, что дает второму шансу расширение скобки: 1..3
- это правильно сформированное выражение последовательности и, следовательно,Расширение фигурных скобок дает ожидаемый результат:
1 2 3
Избегайте использования eval
Обычно следует избегать использования eval
, так как это легко создает проблемы безопасности: Если number1
или number2
получать входные данные и не должным образом очищены, вредоносный код может быть введен в вашу программу.См. этот связанный вопрос о способах замены eval
в различных случаях использования.
В вашем конкретном примере вместо этого можно создать последовательность с помощью цикла for в сочетании с арифметической оценкой:
for ((i=number1 ; i<=number2; i+=1)); do echo -n "$i" ; done | xargs
1 2 3
Популярным решением, не относящимся к Bash, было бы использование seq
(как указал Уолтер А в его ответе ), как в seq "$number1" "$number2" | xargs
.
Примечание: xargs
объединяет многострочный вывод в одну строку в этих примерах.
Дополнительная информация
Этот ответ на связанный вопрос дает дополнительную информацию по теме.
Кроме того, раздел РАСШИРЕНИЕ на странице руководства bash (1) довольно информативен в отношении последовательности и работы различных механизмов расширения.