сценарий удара – поскольку я в {x.. y}

я пишу сценарий в ударе, и я хотел бы дать эти два числа в скобках, X и Y, чтобы быть точным, как переменные.

Я записал сценарию этот путь:

echo "x?"
read x
echo "y"
read y

for i in {$x..$y}

но это не работает.

Как я мог настроить его, чтобы заставить его функционировать?

Большое спасибо заранее.

0
задан 20 July 2018 в 06:15

2 ответа

Используйте это простое 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?

3
ответ дан 28 October 2019 в 07:44
  1. Извините за мой плохой английский язык
  2. Можно сделать это:

В ударе

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}".

0
ответ дан 28 October 2019 в 07:44

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

Похожие вопросы: