/ / bash loop через список номерів, крім заданого числа - bash, циклів

bash цикл через список номерів крім заданого числа - bash, loops

прокручувати безперервний список чисел у bash я можу зробити

for s in $(seq 1 5);do
echo ${s}
done

прокручувати безперервний список чисел, що залишають заданий номер у python, який я можу зробити:

list = [s2 for s2 in range(6)[1:] if s2 != s1]
for s1 in list:
print s1

де список містить всі номери в діапазоні, окрім s1

Як зробити те ж саме в bash?

Відповіді:

5 за відповідь № 1

Просто використовуй continue щоб пропустити цей крок:

for s in {1..5}                 # note there is no need to use $(seq...)
do
[ "$s" -eq 3 ] && continue   # if var is for example 3, jump to next loop
echo "$s"
done

Це повертається:

1
2
4             # <--- 3 is skipped
5

Від Довідковий посібник для Bash → 4.1:

продовжуй

continue [n]

Відновити наступну ітерацію додавання,, поки, або виберіть петлі. Якщо n подається, то виконання n-го циклу, що вкладається, є відновлено. n має бути більше або дорівнює 1. Статус повернення - нуль, якщо n не більше або не дорівнює 1.


2 для відповіді № 2

Додати оцінку короткого замикання, || (логічне АБО):

for s in $(seq 1 5); do
(( s == 3 )) || echo "$s"
done

(( s == 3 )) перевіряє чи $s дорівнює 3, якщо ні (||) echo Кількість.

З зворотною перевіркою ($s не дорівнює 3) і логічний AND (&&):

for s in $(seq 1 5); do
(( s != 3 )) && echo "$s"
done

Класичний спосіб, if з test ([), не справедливості test:

for s in $(seq 1 5); do
if [ "$s" -ne 3 ]; then
echo "$s"
fi
done

Зворотний test, перевірка справедливості:

for s in $(seq 1 5); do
if [ "$s" -eq 3 ]; then
continue
fi
echo "$s"
done

continue зробить керування циклом зверху, а не оцінює наступні команди.


Існує також а bash ключове слово [[ який поводиться аналогічно в більшості випадків, але більш надійний.


2 для відповіді № 3

Можна використовувати BASH арифметичну конструкцію ((...)) подобається це:

s1=3  # skip this
s2=6  # upper count

for ((i=1; i<s2; i+=(i==s1-1?2:1) )); do echo $i; done

1
2
4
5

Про: i+=(i==s1-1?2:1)

У контурі for замість постійного збільшення i по 1 тут ми збільшуємо i по 2 коли i є 1 менше, ніж число, яке буде пропущено.


Альтернативно рішення за допомогою масиву BASH:

arr=({1..5})    # populate 1 to 5 in an array
unset arr[s1-1] # delete element s1-1
# print the array
printf "%sn" "${arr[@]}"

1
2
4
5