Как правильно определить порядок параметров?

Совместное сопоставление выходных данных на самом деле не двойственно tee. teeделает несколько копий своих входных данных, в то время как сопоставление выходных данных не требует объединения данных.

Чтобы объединить источники вывода, просто перенаправьте их все на один и тот же файловый дескриптор. Чередование источников в целом несколько непредсказуемо, но достаточно небольшие записи в канал гарантированно будут атомарными .(Способность различать границы со стороны чтения — это отдельная история .)

{ data_source_1 &
  data_source_2 &
  wait; } >merged_output

Если вы получаете входные данные от нескольких файловых дескрипторов и хотите их объединить, пропустите каждый из них.

{ cat <&3 & cat <&4 & wait; } >merged_ouput

Но обычно вы можете перенаправить все файловые дескрипторы в одно и то же место назначения.

… 3>merged_ouput 4>&3

2
08.08.2019, 12:12
1 ответ

Ваша опция -nпринимает аргумент, поэтому вам нужно getopts 'n:' arg.

Аргумент option можно найти в $OPTARG.

Не трогайте OPTINDв цикле while getopts.

После цикла shift "$(( OPTIND - 1 ))". Это оставляет имена файлов в позиционных параметрах.

То есть,

#!/bin/sh

level=5
while getopts 'n:' arg; do
    case $arg in
      n) level=$OPTARG ;;
      *) echo 'Error in command line parsing' >&2
    esac
done

shift "$(( OPTIND - 1 ))"

for name do
    # stuff
done

Далее, вы никогда не обрабатываете случай отсутствия входных файлов.

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

if [ "$#" -eq 0 ]; then
    # handle no filenames, for example:
    set -- /dev/stdin
fi

for name do
     # stuff
done

Остальное я оставлю вам (, но я настоятельно рекомендую убрать sortиз awkи запустить его как отдельный этап в конвейере для ясности ).

2
27.01.2020, 21:58

Теги

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