Цикл, который записывает все числа между двумя входными числами, которые записываются в файл

dpkg printun(unknown ), так как его база данных не обновлена. Вы можете использовать пакет sync-availablefrom dctrl-toolsдля синхронизации информации dpkgс apt.

sudo apt install dctrl-tools
sudo sync-available

man sync-available:

 sync-available - sync dpkg's available database with apt's database 

DESCRIPTION
This program updates the dpkg(8) available database with the data in the apt(8)
package database. This is required for grep-available(1) and other similar
programs to give up-to-date results.

0
10.09.2020, 17:07
5 ответов

Не уверен, что это будет работать в вашей версии bash, так как кажется, что команда seq недоступна,но вы можете попробовать с диапазоном for, например

#!/bin/bash
for n in {220210..220221}
 do
  echo $n >> numberfile.txt 
done
-1
18.03.2021, 23:05

Это можно сделать с помощью утилиты настольного калькулятора dc. Загрузите два номера диапазона в любом порядке. Только не забудьте изменить знак отрицательного числа как подчеркивание вместо тире. Например, -32 будет выглядеть как _32.

dc <<EOF
220201 220210
[larsa]sb
[lap1+sadla<+]s+
sadla>bla
sal+xp
EOF

Результаты:

220201
220202
220203
220204
220205
220206
220207
220208
220209
220210

Еще один метод заключается в использовании утилиты bcдвоичного калькулятора. Как видите, загрузите числа в любом порядке, bc изменит их, если потребуется, и начнет цикл от меньшего к большему с шагом 1.

echo "a=7;b=0;if(a>b){t=a;a=b;b=t;};for(i=a; i<=b; i++) {i;}" | bc
0
18.03.2021, 23:05

Чтобы записать все целые числа в диапазоне [220210,220221] в файл, используя оболочку bash(или любую оболочку, имеющую раскрытие фигурных скобок):

printf '%s\n' {220210..220221} >file

Здесь происходит то, что оболочка расширит раскрытие фигурной скобки {220210..220221}до списка всех целых чисел в диапазоне. Затем они будут использоваться в качестве аргументов команды printf.

Команда printfвыводит свои аргументы в соответствии со своей строкой формата (1-й аргумент ). Строка формата %s\nсообщает printfо выводе каждого аргумента в виде строки с завершающим символом новой строки. Поскольку вы выводите целые числа, вы могли бы также использовать %d\n, но это не имело бы никакого значения.

Перенаправление >fileуказывает оболочке поместить весь вывод команды printfв файл с именем file. Файл будет создан или, если он уже существует, сначала будет усечен (и очищен ).


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

В такой оболочке вы можете захотеть сделать явный цикл:

n=220210
while [ "$n" -le 220221 ]; do
    printf '%s\n' "$n"
    n=$(( n + 1 ))
done

Это создает переменную n, которую мы печатаем и увеличиваем на каждой итерации. Начальное значение переменной устанавливается на 220210 перед циклом, и цикл завершается всякий раз, когда $nдостигает 220222 (, это значение не будет напечатано ).

0
18.03.2021, 23:05

Правильный способ сделать это - использовать seqили расширение скобок, как показали другие ответы. Если по какой-то причине вы не можете и нуждаетесь в простой оболочке POSIX, вы можете попробовать:

#!/bin/sh

i=$1;

while [ $i -le $2 ]; do
  echo "$i"
  i=$((i+1))
done

Несколько более современным (, но менее переносимым, не -POSIX )синтаксисом будет:

#!/bin/bash

for((i=$1;i<=$2;i++)); do
  echo "$i"
done
0
18.03.2021, 23:05

awk есть почти в каждом дистрибутиве за последние 30 лет, и это базовый K&R awk.

echo 220210 220221 | awk '{ for (j = $1; j <= $2; j++) print j }'
0
18.03.2021, 23:05

Теги

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