Использование диапазона аргументов командной строки в bash для цикла выводит скобки, содержащие аргументы - PullRequest
53 голосов
/ 17 апреля 2011

Это, наверное, неубедительный вопрос.Но я получаю 3 аргумента из командной строки [bash script].Затем я пытаюсь использовать их в цикле for.

for i in {$1..$2}
    do action1
done

Это, похоже, не работает, и если $1 равно "0" и $2 равно 2, оно печатает {0..2}' and calls action1` только один раз.Я ссылался на различные примеры, и это, кажется, правильное использование.Может кто-нибудь сказать, пожалуйста, что нужно исправить здесь?

Заранее спасибо.

Ответы [ 5 ]

70 голосов
/ 14 октября 2011

Вы можете нарезать ввод с помощью ${@:3} или ${@:3:8}, а затем зациклить его

Например, для печати аргументов, начиная с 3

for i in ${@:3} ; do echo $i; done

или для печати 8аргументы, начиная с 3 (так, аргументы с 3 по 10)

for i in ${@:3:8} ; do echo $i; done
61 голосов
/ 17 апреля 2011

Как насчет:

for i in $(eval echo {$1..$2}); do echo $i; done
17 голосов
/ 17 апреля 2011

Использовать переменную $ @?

for i in $@
do
    echo $i
done

Если вы просто хотите использовать 1-й и 2-й аргумент, просто

for i in $1 $2 

Если ваши $ 1 и $ 2 являются целыми числами и вы хотите создать диапазон, используйте C для синтаксиса цикла (bash)

for ((i=$1;i<=$2;i++))
do
...
done
8 голосов
/ 22 декабря 2012

У меня была похожая проблема.Я думаю, что проблема в разыменовании $ 1 в фигурных скобках '{}'.Следующая альтернатива сработала для меня ..

#!/bin/bash
for ((i=$1;i<=$2;i++))
do
   ...
done

Надеюсь, это поможет.

0 голосов
/ 04 сентября 2013
#/bin/bash
for i
do
  echo Value: $i
done

Это зациклит все аргументы, переданные в файл скрипта.Обратите внимание, что после переменной цикла i.

нет «do» или чего-либо еще
...