В чем разница между этими двумя вещами? - PullRequest
0 голосов
/ 03 февраля 2019

Я просто хотел узнать, в чем разница:

echo {$number1..$number2}

И

eval echo {$number1..$number2}

Конечно, представьте себе, чтоесть значение в $ number1 и $ number2.С первым вариантом просто не работает, а со вторым работает.Я не типичный парень, который только хочет, чтобы что-то работало, я хочу понять, почему это происходит так, почему именно так происходит?

Ответы [ 2 ]

0 голосов
/ 03 февраля 2019

Замена переменных слишком поздняя.
Вы можете избежать eval с помощью

seq -s " " "$number1" "$number2"
0 голосов
/ 03 февраля 2019

Почему первое выражение не работает должным образом

  1. Расширение фигурной скобки выполняется перед расширением переменной.$number1..$number2 не является допустимым выражением последовательности, поэтому все выражение остается без изменений.
  2. После этого происходит расширение переменной, в результате чего получается выражение {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) довольно информативен в отношении последовательности и работы различных механизмов расширения.

...