я пишу сценарий в ударе, и я хотел бы дать эти два числа в скобках, X и Y, чтобы быть точным, как переменные.
Я записал сценарию этот путь:
echo "x?"
read x
echo "y"
read y
for i in {$x..$y}
но это не работает.
Как я мог настроить его, чтобы заставить его функционировать?
Большое спасибо заранее.
Используйте это простое bash
решение:
for ((i=$x;i<=$y;i++))
Перед использованием следующих функций читайте ниже!
Для последовательности чисел Вы могли бы использовать seq
:
for i in $(seq $x $y)
Если Вы действительно должны заключить в фигурные скобки расширение, можно использовать eval
:
for i in $(eval echo {$x..$y})
Отказ от ответственности:
eval
является злым. Этот случай является идеальным примером: Если пользователь пишет $(do_something_evil)
вместо числа, do_something_evil
будет выполняться. Таким образом перед использованием eval
, удостоверьтесь, что Ваш вход не является злым. То же относится seq $x $y
.
Если Вы все еще хотите использовать одну из этих функций, протестировать ввод данных пользователем, который обычно является хорошей идеей: Как я тестирую, если переменная является числом в Bash?
В ударе
echo -n "x: "; read x
echo -n "y: "; read y
"Как" для {$x.. $y}
for i in $(echo "echo {$x..$y}" | /bin/bash)
do
echo $i
done
или короче
/bin/bash -c "echo {$x..$y}" | tr " " "\n"
С awk
echo "$x:$y" | awk -F ":" '{while($1<=$2){print $1; $1++}}'
С xargs
bash -c "echo {$x..$y}" | xargs --max-args=1 # or use -n instead --max-args. The same with parallel
С параллелью
parallel -d " " --max-args=1 echo :::: <(bash -c "echo {$x..$y}" )
В zsh
for i in {$x..$y}
do
echo $i
done
Результатом является почти то же во всех случаях.
В Вашем коде:
for i in {$x..$y}
Не работает, потому что расширение фигурной скобки имеет больше приоритета, чем переменное расширение. Можно считать это в man bash
.
Я имею в виду, {$x..$y}
не {1..6}
расширение, или что бы то ни было, причина, которая предполагает обратное, т.е., то переменное расширение, имеет больше приоритета, чем расширение фигурной скобки, затем $y
и $x
не расширяется затем {$x..$y}
ни один, затем это просто печатает "{1.. 6}" буквально, т.е., сначала печать "{$x.. $y}" и не может сделать расширение фигурной скобки потому что $x
и $y
не целые числа, затем разворачивают переменные и печать "{1.. 6}".