Я пытаюсь запустить две последовательности в одном цикле в моей оболочке, как показано ниже:
#!/bin/bash
for i in (1..15) and (20..25) ;
do
echo $i
......
.....other process
done
Есть идеи, как мне этого добиться?
command-line
bash
sh
Hisi
источник
источник
Ответы:
Вам нужно только расширение скобки для этого
Мы можем передать список
for
( ).for i in x y z; do stuff "$i"; done
Итак, здесь фигурные скобки
{
}
получают оболочку для расширения ваших последовательностей в список. Вам нужно только поставить пробел между ними, так как оболочка разделяет списки аргументов на них.источник
echo
цифрыtouch
файлы, они могут просто сделатьtouch {1..15}.txt {20..25}.txt
, никакой цикл здесь не нужен. Но, конечно, если это несколько действий на одном номере - хорошо, это может использовать цикл.В качестве альтернативы мы можем использовать
seq
( вывести последовательность чисел ), вот два эквивалентных примера:Если это скрипт, для повторяющихся задач вы можете использовать функции:
источник
Ответ Žanna в и ответ pa4080 игровых оба хороши , и я бы , вероятно , пойти с одним из них в большинстве случаев. Возможно, само собой разумеется, но ради полноты я все равно скажу: вы можете загрузить каждое значение в массив, а затем выполнить цикл по массиву. Например:
источник
Цикл без петли
Ответ Занны абсолютно правильный и хорошо подходит для bash, но мы можем улучшить его еще больше, не используя цикл.
Поведение
printf
таково, что если числоARGUMENTS
больше, чем в элементах управления форматированием'FORMAT STRING'
, то оноprintf
будет разбивать всеARGUMENTS
на равные куски и продолжать их подгонять к строке формата снова и снова, пока не закончитсяARGUMENTS
список.Если мы стремимся к мобильности, мы можем использовать
printf "%d\n" $(seq 1 15) $(seq 20 25)
вместоДавайте продолжим и повеселимся. Скажем, мы хотим выполнить действие, а не просто печатать цифры. Для создания файлов из этой последовательности чисел мы могли бы легко это сделать
touch {1..15}.txt {20..25}.txt
. Что если мы хотим, чтобы происходило несколько вещей? Мы также могли бы сделать что-то вроде этого:Или, если мы хотим сделать это в стиле старой школы:
Портативная, но многословная альтернатива
Если мы хотим создать скрипт-решение, которое работает с оболочками, не имеющими расширения скобок (на что
{1..15} {20..25}
опирается), мы можем написать простой цикл while:Конечно, это решение более многословно, некоторые вещи могут быть сокращены, но оно работает. Испытано с
ksh
,dash
,mksh
и, конечно жеbash
.Bash C-стиль петли
Но если мы хотим сделать цикл специфичным для bash (по какой-то причине, возможно, не просто печатать, но и делать что-то с этими числами), мы также можем сделать это (в основном, версия C-loop портативного решения):
Или в более читаемом формате:
Сравнение производительности различных циклических подходов
Альтернатива без оболочки
Просто потому, что мы можем вот решение Python
Или с небольшим количеством раковины:
источник
touch $(printf "%d\n" {1..15} {20..25})
:-)bash
вам там даже не нужно$()
, простоtouch {1..15}.txt {20..25}.txt
:) Но, конечно, мы могли бы использоватьprintf "%d\n
{1..15} {20..25} `с,xargs
если мы хотим делать больше, чем простоtouch
файлы. Есть много способов сделать что-то, и это делает скрипты такими забавными!