Значение по умолчанию легко определить в 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
вместо этого, потому что это может обработать много особых случаев, которые очень быстро усложнили бы и создали бы помехи Вашему коду (Нетривиальный пример).
вы просто делаете
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 очень большое.
Использование петли:
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
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
С 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).
Демон обычно работает без взаимодействия. Учитывая, что существует проблема с предоставлением пароля, который не требуется сохранять в файле конфигурации или файла запуска для демона.
То, что я сделал в таких ситуациях:
/root/
, если у него нет пароля каждые 10 секунд. Запись в системный журнал каждые 10 минут, но продолжение невозможно. Поскольку /root
обычно относительно не читается другими пользователями, это было достаточно безопасно для моей установки. Можно проверить наличие разрешений /root
и отказаться от записи файла, если они не 700
.
Если пароли проверяются в источниках (а не передаются какой-либо программе, которая может в них нуждаться), убедитесь, что они не могут быть прочитаны кем-либо другим.
-121--230328-Добавление md5sum в файл приводит к изменению md5sum содержимого файла. Более обычным является сохранение md5sum в отдельном файле или изменение имени файла, чтобы включить md5sum:
mv abc.tar abc.tar.$(md5sum abc.tar | cut -d ' ' -f 1)
Есть файлы, которые хранят контрольную сумму в файле (где-то в заголовке, или в конце) Это зависит от программы, которая проверяет это, чтобы знать, где контрольная сумма и не включать его в расчет самой контрольной суммы.
ИМО не следует использовать -t в файле .tar
.
С помощью 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 удалить каждую другую новую строку .
Вы можете использовать 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
Все изящные решения были взяты... так с 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