Пропустите две последовательности в одном цикле

Установка Ubuntu использует все свободное место на диске. Итак, первым шагом для вас было бы сохранить ваши личные данные с вашего HDD в другом месте.

Из окон вам нужно изучить некоторые новые концепции для разбиения на linux.

целое система организована в одну папку. корневая папка «/» разных разделов будет интегрирована в систему с подпапками. например «/ home» для всех пользовательских данных или «/ games» для специального раздела, чтобы содержать игры.

Следующий шаг заключается в том, что вы должны научиться отличать физические диски и виртуальные разделы с помощью lvm.

Менеджер lvm может создавать разные виртуальные разделы на вашем физическом жестком диске. Преимущество состоит в том, что впоследствии разделы могут быть изменены.

эти разделы будут связаны с папками с командой «mount». вы можете найти организацию своих разделов и где они подключены к вашей системе в файловой системе в файле «/ etc / fstab» и с помощью команды «df -m».

Надеюсь, что это помогло вы несколько.

8
задан 24 October 2017 в 16:25

12 ответов

Вам нужно только расширение скобки для этого

$ for n in {1..3} {200..203}; do echo $n; done
1
2
3
200
201
202
203

Мы можем передать список в for (for i in x y z; do stuff "$i"; done).

Итак, здесь фигурные скобки { [ f5] получить оболочку для расширения ваших последовательностей в список. Вам просто нужно поставить пробел между ними, поскольку оболочка разбивает списки аргументов на них.

10
ответ дан 22 May 2018 в 17:11
  • 1
    Да, брекеты. , , И вам даже не нужен цикл для этого ^ _0 – Sergiy Kolodyazhnyy 26 October 2017 в 22:49
  • 2
    @SergiyKolodyazhnyy Я полагаю, что они на самом деле просто не хотят echo числа – Zanna 27 October 2017 в 09:51
  • 3
    yep, если они хотят какого-то действия, например touch файлов, они могут просто делать touch {1..15}.txt {20..25}.txt, здесь не нужен цикл. Но, конечно, если это несколько действий на одном номере - ОК, это может использовать цикл. – Sergiy Kolodyazhnyy 27 October 2017 в 10:31

Вам нужно только расширение скобки для этого

$ for n in {1..3} {200..203}; do echo $n; done 1 2 3 200 201 202 203

Мы можем передать список в for (for i in x y z; do stuff "$i"; done).

Итак, здесь фигурные скобки { } получить оболочку для расширения ваших последовательностей в список. Вам просто нужно поставить пробел между ними, поскольку оболочка разбивает списки аргументов на них.

10
ответ дан 18 July 2018 в 04:40

Вам нужно только расширение скобки для этого

$ for n in {1..3} {200..203}; do echo $n; done 1 2 3 200 201 202 203

Мы можем передать список в for (for i in x y z; do stuff "$i"; done).

Итак, здесь фигурные скобки { } получить оболочку для расширения ваших последовательностей в список. Вам просто нужно поставить пробел между ними, поскольку оболочка разбивает списки аргументов на них.

10
ответ дан 24 July 2018 в 18:08

В качестве альтернативы мы можем использовать seq (печатать последовательность чисел), вот два эквивалентных примера:

for i in `seq 1 3` `seq 101 103`; do echo $i; done
for i in $(seq 1 3) $(seq 101 103); do echo $i; done

Если это сценарий, для повторяющихся задач вы можете использовать функции:

#!/bin/bash
my_function() { echo "$1"; }
for i in {1..3}; do my_function "$i"; done
for i in {101..103}; do my_function "$i"; done
#!/bin/bash
my_function() { for i in `seq $1 $2`; do echo "$i"; done; }
my_function "1" "3"
my_function "101" "103"
6
ответ дан 22 May 2018 в 17:11

Ответ Zanna и ответ pa4080 оба хороши, и я, вероятно, поеду с одним из них в большинстве случаев. Возможно, это само собой разумеется, но, ради полноты, я все равно скажу: вы можете загружать каждое значение в массив и затем перебирать массив. Например:

the_array=( 1 2 3 4 5 6 7 8 9 10 20 21 22 23 24 25 )
for i in "${the_array[@]}";
do
    echo $i
done
4
ответ дан 22 May 2018 в 17:11
  • 1
    @ СергейКолодянный: Спасибо, обратная связь. Я достаточно взрослый, так что меня учили, и я обычно делаю это в редком случае, когда я пишу сценарий оболочки. Тем не менее, я обновил ответ на использование массива. – GreenMatt 27 October 2017 в 00:53
  • 2
    Очень хорошо ! Счастливые скрипты! – Sergiy Kolodyazhnyy 27 October 2017 в 01:19

Цикл без цикла

Ответ Zanna абсолютно правильный и хорошо подходит для bash, но мы можем улучшить это даже больше, не используя цикл.

printf "%d\n"  {1..15} {20..25}

Поведение printf таково, что если число ARGUMENTS больше, чем элементы управления форматом в 'FORMAT STRING', тогда printf разделит все ARGUMENTS на равные куски и сохранит вставляя их в строку формата снова и снова, пока не закончится список ARGUMENTS.

Если мы стремимся к переносимости, мы можем использовать printf "%d\n" $(seq 1 15) $(seq 20 25) вместо

. Возьмем это еще и веселее. Предположим, мы хотим выполнить действие, а не просто печатать цифры. Для создания файлов из этой последовательности чисел мы могли бы легко выполнить touch {1..15}.txt {20..25}.txt. Что делать, если мы хотим, чтобы произошло несколько событий? Мы могли бы также сделать что-то вроде этого:

$ printf "%d\n" {1..15} {20..25} | xargs -I % bash -c 'touch "$1.txt"; stat "$1.txt"' sh %

Или, если мы хотим сделать это в стиле старой школы:

printf "%d\n" {1..15} {20..25} | while read -r line; do 
    touch "$line".txt;
    stat "$line".txt;
    rm "$line".txt; 
done

Portable, но verbose alternative

Если мы хотим создать решение скрипта, которое работает с оболочками, у которых нет расширения брекетов (на что полагается {1..15} {20..25}), мы можем написать простой цикл while:

#!/bin/sh
start=$1
jump=$2
new_start=$3
end=$4

i=$start
while [ $i -le $jump ]
do
    printf "%d\n" "$i"
    i=$((i+1))
    if [ $i -eq $jump ] && ! [ $i -eq $end ];then
        printf "%d\n" "$i"
        i=$new_start
        jump=$end
    fi
done

Конечно, это решение более многословно, некоторые вещи могут быть сокращены, но он работает. Протестировано с помощью ksh, dash, mksh и, конечно, bash.

Bash C-style loop

Но если мы хотим создать петлю, специфичную для bash (по любой причине, возможно, не только для печати, но и для чего-то с этими числами), мы также можем это сделать (в основном версия C-loop портативного решения):

last=15; for (( i=1; i<=last;i++ )); do printf "%d\n" "$i"; [[ $i -eq $last ]] && !  [[ $i -eq 25 ]] && { i=19;last=25;} ;done

Или в более читаемом формате:

last=15
for (( i=1; i<=last;i++ )); 
do 
    printf "%d\n" "$i"
    [[ $i -eq $last ]] && !  [[ $i -eq 25 ]] && { i=19;last=25;} 
done

Сравнение производительности различных подходов к циклу

bash-4.3$ time bash -c 'printf "%d\n" {0..50000}>/dev/null'

real    0m0.196s
user    0m0.124s
sys 0m0.028s
bash-4.3$ time bash -c 'for i in {1..50000}; do echo $i > /dev/null; done'

real    0m1.819s
user    0m1.328s
sys 0m0.476s
bash-4.3$ time bash -c ' i=0;while [ $i -le 50000 ]; do echo $i>/dev/null; i=$((i+1)); done'

real    0m3.069s
user    0m2.544s
sys 0m0.500s
bash-4.3$ time bash -c 'for i in $(seq 1 50000); do printf "%d\n" > /dev/null; done'

real    0m1.879s
user    0m1.344s
sys 0m0.520s

Альтернатива без оболочки

Просто потому, что мы можем здесь решить Python

$ python3 -c 'print("\n".join([str(i) for i in (*range(1,16),*range(20,26))]))'

Или с небольшим количеством оболочки:

bash-4.3$ python3 << EOF
> for i in (*range(16),*range(20,26)):
>    print(i)
> EOF
3
ответ дан 22 May 2018 в 17:11
  • 1
    Я только что проверил touch $(printf "%d\n" {1..15} {20..25}) :-) – pa4080 27 October 2017 в 01:18
  • 2
    @ pa4080 на самом деле для bash вам даже не нужен $(), просто touch {1..15}.txt {20..25}.txt :) Но, конечно, мы могли бы использовать printf "%d\n {1..15} {20..25} `с xargs если мы хотим сделать больше, чем только файлы touch. Есть много способов сделать что-то, и это делает так много удовольствия! – Sergiy Kolodyazhnyy 27 October 2017 в 10:43

Ответ Zanna и ответ pa4080 оба хороши, и я, вероятно, поеду с одним из них в большинстве случаев. Возможно, это само собой разумеется, но, ради полноты, я все равно скажу: вы можете загружать каждое значение в массив и затем перебирать массив. Например:

the_array=( 1 2 3 4 5 6 7 8 9 10 20 21 22 23 24 25 ) for i in "${the_array[@]}"; do echo $i done
4
ответ дан 18 July 2018 в 04:40

В качестве альтернативы мы можем использовать seq (печатать последовательность чисел), вот два эквивалентных примера:

for i in `seq 1 3` `seq 101 103`; do echo $i; done for i in $(seq 1 3) $(seq 101 103); do echo $i; done

Если это сценарий, для повторяющихся задач вы можете использовать функции:

#!/bin/bash my_function() { echo "$1"; } for i in {1..3}; do my_function "$i"; done for i in {101..103}; do my_function "$i"; done #!/bin/bash my_function() { for i in `seq $1 $2`; do echo "$i"; done; } my_function "1" "3" my_function "101" "103"
6
ответ дан 18 July 2018 в 04:40

Цикл без цикла

Ответ Zanna абсолютно правильный и хорошо подходит для bash, но мы можем улучшить это даже больше, не используя цикл.

printf "%d\n" {1..15} {20..25}

Поведение printf таково, что если число ARGUMENTS больше, чем элементы управления форматом в 'FORMAT STRING', тогда printf разделит все ARGUMENTS на равные куски и сохранит вставляя их в строку формата снова и снова, пока не закончится список ARGUMENTS.

Если мы стремимся к переносимости, мы можем использовать printf "%d\n" $(seq 1 15) $(seq 20 25) вместо

. Возьмем это еще и веселее. Предположим, мы хотим выполнить действие, а не просто печатать цифры. Для создания файлов из этой последовательности чисел мы могли бы легко выполнить touch {1..15}.txt {20..25}.txt. Что делать, если мы хотим, чтобы произошло несколько событий? Мы могли бы также сделать что-то вроде этого:

$ printf "%d\n" {1..15} {20..25} | xargs -I % bash -c 'touch "$1.txt"; stat "$1.txt"' sh %

Или, если мы хотим сделать это в стиле старой школы:

printf "%d\n" {1..15} {20..25} | while read -r line; do touch "$line".txt; stat "$line".txt; rm "$line".txt; done

Portable, но verbose alternative

Если мы хотим создать решение скрипта, которое работает с оболочками, у которых нет расширения брекетов (на что полагается {1..15} {20..25}), мы можем написать простой цикл while:

#!/bin/sh start=$1 jump=$2 new_start=$3 end=$4 i=$start while [ $i -le $jump ] do printf "%d\n" "$i" i=$((i+1)) if [ $i -eq $jump ] && ! [ $i -eq $end ];then printf "%d\n" "$i" i=$new_start jump=$end fi done

Конечно, это решение более многословно, некоторые вещи могут быть сокращены, но он работает. Протестировано с помощью ksh, dash, mksh и, конечно, bash.

Bash C-style loop

Но если мы хотим создать петлю, специфичную для bash (по любой причине, возможно, не только для печати, но и для чего-то с этими числами), мы также можем это сделать (в основном версия C-loop портативного решения):

last=15; for (( i=1; i<=last;i++ )); do printf "%d\n" "$i"; [[ $i -eq $last ]] && ! [[ $i -eq 25 ]] && { i=19;last=25;} ;done

Или в более читаемом формате:

last=15 for (( i=1; i<=last;i++ )); do printf "%d\n" "$i" [[ $i -eq $last ]] && ! [[ $i -eq 25 ]] && { i=19;last=25;} done

Сравнение производительности различных подходов к циклу

bash-4.3$ time bash -c 'printf "%d\n" {0..50000}>/dev/null' real 0m0.196s user 0m0.124s sys 0m0.028s bash-4.3$ time bash -c 'for i in {1..50000}; do echo $i > /dev/null; done' real 0m1.819s user 0m1.328s sys 0m0.476s bash-4.3$ time bash -c ' i=0;while [ $i -le 50000 ]; do echo $i>/dev/null; i=$((i+1)); done' real 0m3.069s user 0m2.544s sys 0m0.500s bash-4.3$ time bash -c 'for i in $(seq 1 50000); do printf "%d\n" > /dev/null; done' real 0m1.879s user 0m1.344s sys 0m0.520s

Альтернатива без оболочки

Просто потому, что мы можем здесь решить Python

$ python3 -c 'print("\n".join([str(i) for i in (*range(1,16),*range(20,26))]))'

Или с небольшим количеством оболочки:

bash-4.3$ python3 << EOF > for i in (*range(16),*range(20,26)): > print(i) > EOF
3
ответ дан 18 July 2018 в 04:40

Ответ Zanna и ответ pa4080 оба хороши, и я, вероятно, поеду с одним из них в большинстве случаев. Возможно, это само собой разумеется, но, ради полноты, я все равно скажу: вы можете загружать каждое значение в массив и затем перебирать массив. Например:

the_array=( 1 2 3 4 5 6 7 8 9 10 20 21 22 23 24 25 ) for i in "${the_array[@]}"; do echo $i done
4
ответ дан 24 July 2018 в 18:08
  • 1
    @ СергейКолодянный: Спасибо, обратная связь. Я достаточно взрослый, так что меня учили, и я обычно делаю это в редком случае, когда я пишу сценарий оболочки. Тем не менее, я обновил ответ на использование массива. – GreenMatt 27 October 2017 в 00:53
  • 2
    Очень хорошо ! Счастливые скрипты! – Sergiy Kolodyazhnyy 27 October 2017 в 01:19

В качестве альтернативы мы можем использовать seq (печатать последовательность чисел), вот два эквивалентных примера:

for i in `seq 1 3` `seq 101 103`; do echo $i; done for i in $(seq 1 3) $(seq 101 103); do echo $i; done

Если это сценарий, для повторяющихся задач вы можете использовать функции:

#!/bin/bash my_function() { echo "$1"; } for i in {1..3}; do my_function "$i"; done for i in {101..103}; do my_function "$i"; done #!/bin/bash my_function() { for i in `seq $1 $2`; do echo "$i"; done; } my_function "1" "3" my_function "101" "103"
6
ответ дан 24 July 2018 в 18:08

Цикл без цикла

Ответ Zanna абсолютно правильный и хорошо подходит для bash, но мы можем улучшить это даже больше, не используя цикл.

printf "%d\n" {1..15} {20..25}

Поведение printf таково, что если число ARGUMENTS больше, чем элементы управления форматом в 'FORMAT STRING', тогда printf разделит все ARGUMENTS на равные куски и сохранит вставляя их в строку формата снова и снова, пока не закончится список ARGUMENTS.

Если мы стремимся к переносимости, мы можем использовать printf "%d\n" $(seq 1 15) $(seq 20 25) вместо

. Возьмем это еще и веселее. Предположим, мы хотим выполнить действие, а не просто печатать цифры. Для создания файлов из этой последовательности чисел мы могли бы легко выполнить touch {1..15}.txt {20..25}.txt. Что делать, если мы хотим, чтобы произошло несколько событий? Мы могли бы также сделать что-то вроде этого:

$ printf "%d\n" {1..15} {20..25} | xargs -I % bash -c 'touch "$1.txt"; stat "$1.txt"' sh %

Или, если мы хотим сделать это в стиле старой школы:

printf "%d\n" {1..15} {20..25} | while read -r line; do touch "$line".txt; stat "$line".txt; rm "$line".txt; done

Portable, но verbose alternative

Если мы хотим создать решение скрипта, которое работает с оболочками, у которых нет расширения брекетов (на что полагается {1..15} {20..25}), мы можем написать простой цикл while:

#!/bin/sh start=$1 jump=$2 new_start=$3 end=$4 i=$start while [ $i -le $jump ] do printf "%d\n" "$i" i=$((i+1)) if [ $i -eq $jump ] && ! [ $i -eq $end ];then printf "%d\n" "$i" i=$new_start jump=$end fi done

Конечно, это решение более многословно, некоторые вещи могут быть сокращены, но он работает. Протестировано с помощью ksh, dash, mksh и, конечно, bash.

Bash C-style loop

Но если мы хотим создать петлю, специфичную для bash (по любой причине, возможно, не только для печати, но и для чего-то с этими числами), мы также можем это сделать (в основном версия C-loop портативного решения):

last=15; for (( i=1; i<=last;i++ )); do printf "%d\n" "$i"; [[ $i -eq $last ]] && ! [[ $i -eq 25 ]] && { i=19;last=25;} ;done

Или в более читаемом формате:

last=15 for (( i=1; i<=last;i++ )); do printf "%d\n" "$i" [[ $i -eq $last ]] && ! [[ $i -eq 25 ]] && { i=19;last=25;} done

Сравнение производительности различных подходов к циклу

bash-4.3$ time bash -c 'printf "%d\n" {0..50000}>/dev/null' real 0m0.196s user 0m0.124s sys 0m0.028s bash-4.3$ time bash -c 'for i in {1..50000}; do echo $i > /dev/null; done' real 0m1.819s user 0m1.328s sys 0m0.476s bash-4.3$ time bash -c ' i=0;while [ $i -le 50000 ]; do echo $i>/dev/null; i=$((i+1)); done' real 0m3.069s user 0m2.544s sys 0m0.500s bash-4.3$ time bash -c 'for i in $(seq 1 50000); do printf "%d\n" > /dev/null; done' real 0m1.879s user 0m1.344s sys 0m0.520s

Альтернатива без оболочки

Просто потому, что мы можем здесь решить Python

$ python3 -c 'print("\n".join([str(i) for i in (*range(1,16),*range(20,26))]))'

Или с небольшим количеством оболочки:

bash-4.3$ python3 << EOF > for i in (*range(16),*range(20,26)): > print(i) > EOF
3
ответ дан 24 July 2018 в 18:08
  • 1
    Я только что проверил touch $(printf "%d\n" {1..15} {20..25}) :-) – pa4080 27 October 2017 в 01:18
  • 2
    @ pa4080 на самом деле для bash вам даже не нужен $(), просто touch {1..15}.txt {20..25}.txt :) Но, конечно, мы могли бы использовать printf "%d\n {1..15} {20..25} `с xargs если мы хотим сделать больше, чем только файлы touch. Есть много способов сделать что-то, и это делает так много удовольствия! – Sergiy Kolodyazhnyy 27 October 2017 в 10:43

Другие вопросы по тегам:

Похожие вопросы: