Linux bash съвети: Много начини за повторение с bash

The смачквам Обвивката предоставя страхотна функционалност, когато става въпрос за писане на скриптове. Това включва толкова много начини за повторение на купчина данни, че можете да свършите много, като изпълните един скрипт. Независимо дали преглеждате набор от числови стойности, дни от седмицата, потребителски имена, думи, файлове или нещо съвсем друго, смачквам Той има опция, която ви улеснява.

за, докато и докато цикли

Първото нещо, което трябва да знаете за съкращенията смачквам Е, че има няколко основни команди за използване. The Докато Цикълът ще се завърти, докато дадено условие е вярно. The до цикълът ще се изпълнява, докато някое условие стане истина, и за Цикълът ще премине през поредица от стойности, независимо от техния произход.

Например, използвайки Докатоитерация, докато числото е по-малко от 100, итерация през оставащите дни от месеца, както е показано в скрипта по-долу (където улавяме текущия ден с Дата Командата и последният ден от последната серия в изхода кал команда) или преминаване през нещо съвсем различно.

#/bin/bash

# day of month
day=`date | awk '{print $3'}`
# number of days in month
numdays=`cal | tail -2 | head -1 | awk '{print $NF}'`

while [ $day -le $numdays ]
do
    echo $day
    ((day++))
done

Когато стартираме този скрипт, трябва да видим нещо подобно:

$ remaining_days
27
28
29
30

Следният скрипт продължава да се повтаря, докато колега не влезе. Докато броят на потребителските влизания е нула (т.е. те не са влезли), показваме „изчакайте“ и след това изчакайте още 60 секунди. След като потребителят влезе в системата, Докато Цикълът се излиза и в рамките на 60 секунди се появява съобщение, потвърждаващо присъствието на потребителя за влизане.

#!/bin/bash

echo -n "user to wait for> "
read user

while [ `who | grep $user | wc -l` == 0 ]
do
    echo waiting
    sleep 60
done

echo $user is online

The до Епизодичната версия на сценария е много подобна.

#!/bin/bash

echo -n "user to wait for> "
read user

until [ `who | grep $user | wc -l` -gt 0 ]
do
    echo waiting
    sleep 60
done

в за Цикли, преминаваме през поредица от стойности, но има няколко команди, които можете да използвате, за да генерирате тези стойности.

The Докато И на до Командите са обяснени по-нататък в Как да повтаряте команда на Linux, докато не работи

Повторение между букви и цифри

Можете да повторите низ от числа или знаци, като посочите диапазон от стойности във файл {старт стоп} Форматирайте като в примерите по-долу. Имайте предвид, че можете да започнете с всяка стойност, която желаете. Не е нужно да започвате с “a” или “0”.

$ for letter in {a..f}; do   echo $letter; done
a
b
c
d
e
f

В този следващ пример започваме с 5, а не с 1 и избягваме връщането на първия от реда с ехо n поръчка.

$ for number in {5..11}; do   echo -n "$number "; done
5 6 7 8 9 10 11 $

Можете дори да обърнете реда на цифрите или буквите, ако желаете. Ето няколко примера:

$ for letter in {z..x}; do   echo $letter; done
z
y
x
$ for number in {11..7} > do > echo $number > done 11 10 9 8 7

повтаряй завинаги

Най-лесният начин да повтаряте завинаги е да използвате “Понякога вярноЦикълът няма да спре да работи, освен ако не го убиете – например с a ^ c. Ако е включен в скрипт, работещ във фонов режим, можете да използвате a убиване Команда (напр. kill 654321) за прекратяване на скрипта.

$ while true
> do
>     echo Hello
>     sleep 60
> done
Hello
Hello
^C

Повече информация за зациклянето завинаги е достъпна на Как да зацикля завинаги в bash на Linux.

Изходни цикли с прекъсване и продължение

The почивка И на продължи Командите ви позволяват да излезете изцяло от цикъла (почивка) или рестартирайте в горната част на цикъла (продължи), пропускайки всички команди между продължи Командата и краят на епизода.

The почивка И на продължи Командите са обяснени по-подробно в Използвайте прекъсване и продължете да излизате от примките.

The гънки Командата може да се използва за разделяне на файл или низ на части с еднакъв размер. Дължината по подразбиране е 80 знака. В този пример ние разделяме низа на части от 11 знака, като използваме разширението -c11 (11 букви) Опция.

$ fold -c11 trythis
This file h
as a few ri
diculously
long charac
ter strings
. Oh, well.

При използване на файл гънки Въпросът е в а за цикъл обаче, трябва да запомните, че всеки резултантен низ, съдържащ празно място, ще доведе до един или повече допълнителни цикли, защото за Запетайките на всеки низ са разделени с празно място.

$ for line in `fold -c10 trythis`
> do
>   echo -n "$line"
>   echo -n ":"
>   echo $line | wc -c
> done
This:5
file:5
has:4
a:2
few:4
ridiculous:11
ly:3
long:5
ch:3
aracter:8
st:3
rings.:7
Oh,:4
well.:6

Повече за гънки Командата може да бъде намерена на Използвайте сгъване, за да направите текста по-четлив И на Използвайте командата за сгъване, за да управлявате цикли.

Повторение дума по дума

за итериране през списък с думи, използвайки a за цикъл, можете да изпълните команда като тази по-долу. Имайте предвид, че апострофът трябва да бъде екраниран, за да не се интерпретира като начало на низ.

$ for word in all's well that ends well; do   echo $word; done
all's
well
that
ends
well

Ако искате месеците от годината да се повтарят, можете да използвате команда като тази:

$ for month in `locale mon | sed 's/;/ /g'`; do   echo $month; done
January
February
March
April
May
June
July
August
September
October
November
December

Горната команда използва файл езика команда за получаване на списък с месеци и г-н Разделя реда, разделен с точка и запетая, на отделни месеци.

Съдържа се

Излишъкът в скриптовете и командния ред на Linux очевидно е една от най-добрите техники за свършване на много за кратко време и с минимални усилия, особено ако превърнете вашите цикли в скриптове, които можете да изпълнявате често. Колкото е необходимо, без да се налага всеки път да обмисляте всеки детайл.

Авторско право © 2022 IDG Communications, Inc. Всички права запазени.