Как я создаю список с числами как это?

Значение по умолчанию легко определить в Bash:

foo="${bar-default}" # Sets foo to the value of $bar if defined, "default" otherwise
foo="${bar:-default}" # Sets foo to the value of $bar if defined or empty, "default" otherwise

Для обработки параметров можно использовать простой цикл:

while true
do
    case "${1-}" in
        -in)
            infile="${2-}"
            shift 2
            ;;
        -out)
            outfile="${2-}"
            shift 2
            ;;
        *)
            break
            ;;
    esac
done

program -in "${infile-otherfile}" -out "${outfile-otherout}" "$@"

Полезные чтения:

Я также рекомендую использовать getopt вместо этого, потому что это может обработать много особых случаев, которые очень быстро усложнили бы и создали бы помехи Вашему коду (Нетривиальный пример).

7
07.11.2014, 01:23
8 ответов

вы просто делаете

seq 1 n | xargs -n 5 echo

n, являясь числом, которое вы хотите достигнуть

Если ваша операционная система имеет bash, но не seq, вот альтернатива (thx к @cuonglm и @jimmyj для их замечаний)

echo {1..n} | xargs -n5

(вы можете быть осторожны, когда достигаете очень высокое число с этим, в зависимости от версии операционной системы и bash, и если bash действительно пытался сначала расширить или в этом случае достаточно умён, чтобы кормить понемногу, не пытаясь подогнать всю 1. .n в качестве строки в памяти и передать ее в эхо... )

И благодаря cuonglm и StephaneChazelas, я добавил альтернативу, которая очень, очень мало потребляет процессор, чем мое первое решение xargs (в котором xargs вызывает /bin/echo, вместо того, чтобы использовать сборку оболочки, каждые 5 чисел) :

printf '%s %s %s %s %s\n' {1..n}

Это второе и третье решение отличается от первого тем, что оболочка должна сначала развернуть 1. .n, до того, как printf (или xargs) может начать печатать, если я не ошибаюсь... так что это начинается позже (особенно, если n большое).... И может достичь некоторых ограничений (длина строки или памяти, в зависимости от реализации и операционной системы), если n очень большое.

15
27.01.2020, 20:13

Использование петли:

for x in {1..15};do echo -n "$x ";if [ $(($x%5)) -eq 0 ];then echo ; fi done

Выход:

1 2 3 4 5 
6 7 8 9 10 
11 12 13 14 15 
2
27.01.2020, 20:13

Pure coreutils:

$ seq 15 | paste - - - - - 
1   2   3   4   5
6   7   8   9   10
11  12  13  14  15

Pure perl:

$ perl -e '@a=1..15; while($i<=$#a){print "@a[$i..$i+4]\n";$i+=5}'
1 2 3 4 5
6 7 8 9 10
11 12 13 14 15

GNU grep (беззастенчиво украденная из @1_CR):

$ echo {1..15} | grep -oP '(\d+ ){4}\d+'
1 2 3 4 5
6 7 8 9 10
11 12 13 14 15

Если вы не против вести 0s:

$ echo {01..15} | fold -sw 16
01 02 03 04 05 
06 07 08 09 10 
11 12 13 14 15

А если против:

$ echo {01..15} | fold -sw 16 | sed 's/0\([1-9]\) /\1 /g'
1 2 3 4 5 
6 7 8 9 10 
11 12 13 14 15

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

printnums(){
 seq $1 | paste - - - - - 
}

Затем можно выполнить

$ printnums 30
1   2   3   4   5
6   7   8   9   10
11  12  13  14  15
16  17  18  19  20
21  22  23  24  25
26  27  28  29  30
8
27.01.2020, 20:13

С ZSH :

$ print -aC5 {1..15}
1   2   3   4   5
6   7   8   9   10
11  12  13  14  15

$ autoload zargs # if not in ~/.zshrc
$ zargs -n 5 {1..15} -- echo
1 2 3 4 5
6 7 8 9 10
11 12 13 14 15

$ printf '%s %s %s %s %s\n' {1..15}
1 2 3 4 5
6 7 8 9 10
11 12 13 14 15

(который последний также работает в последних версиях KSH93 или Bash).

4
27.01.2020, 20:13

Демон обычно работает без взаимодействия. Учитывая, что существует проблема с предоставлением пароля, который не требуется сохранять в файле конфигурации или файла запуска для демона.

То, что я сделал в таких ситуациях:

  1. Пусть демон ищет файл в /root/, если у него нет пароля каждые 10 секунд. Запись в системный журнал каждые 10 минут, но продолжение невозможно.
  2. Установите для программы-демона опцию, которая при использовании запрашивает пароль и записывает пароль в правильный файл
  3. После того, как файл существует, демон считывает содержимое и удаляет файл.

Поскольку /root обычно относительно не читается другими пользователями, это было достаточно безопасно для моей установки. Можно проверить наличие разрешений /root и отказаться от записи файла, если они не 700 .

Если пароли проверяются в источниках (а не передаются какой-либо программе, которая может в них нуждаться), убедитесь, что они не могут быть прочитаны кем-либо другим.

-121--230328-

Добавление md5sum в файл приводит к изменению md5sum содержимого файла. Более обычным является сохранение md5sum в отдельном файле или изменение имени файла, чтобы включить md5sum:

mv abc.tar abc.tar.$(md5sum  abc.tar | cut -d ' ' -f 1)

Есть файлы, которые хранят контрольную сумму в файле (где-то в заголовке, или в конце) Это зависит от программы, которая проверяет это, чтобы знать, где контрольная сумма и не включать его в расчет самой контрольной суммы.


ИМО не следует использовать -t в файле .tar .

-121--217587-

С помощью awk можно сказать:

seq 15 | awk 'ORS=NR%5?FS:RS'

Он возвращает:

1 2 3 4 5
6 7 8 9 10
11 12 13 14 15

В основном, он изменяет выходной разделитель записей (разделитель строк) на разделитель полей (космос, по умолчанию) или разделитель записей (новая строка, по умолчанию). Таким образом, если число строк кратно 5 , добавляется новая строка; в противном случае - космос.

Я написал более широкое объяснение в аналогичном вопросе: bash/sed/awk/etc удалить каждую другую новую строку .

2
27.01.2020, 20:13

Вы можете использовать seq, tr и sed:

seq 15 | tr '\n' ' ' | sed 's/\([0-9]* [0-9]* [0-9]* [0-9]* [0-9]* \)/\1\
/g'

или как оптимизированную комбинацию ответов Оливье, Бенуа и меня (в его комментариях):

seq 15 | xargs -n 5
1
27.01.2020, 20:13

Все изящные решения были взяты... так с GNU awk и удар

echo {1..15} | awk -v RS='[[:space:]]' '{ORS=NR % numcols?RT:"\n"; print}' numcols=5
1 2 3 4 5
6 7 8 9 10
11 12 13 14 15

или с GNU grep

echo {1..15} | grep -oE '([[:digit:]]+[[:blank:]]+){4}[[:digit:]]+'
1 2 3 4 5
6 7 8 9 10
11 12 13 14 15
1
27.01.2020, 20:13

С помощью printf и brace expansion:

printf '%s %s %s %s %s\n' {1..15}
5
27.01.2020, 20:13

Теги

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