прокручувати безперервний список чисел у 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