Вы можете сделать все это в одном цикле while внутри сценария оболочки.Вот версия bash:
s=0
while read x; do
if [ ! $mi ]; then
mi=$x
elif [ $mi -gt $x ]; then
mi=$x
fi
if [ ! $ma ]; then
ma=$x
elif [ $ma -lt $x ]; then
ma=$x
fi
s=$((s+x))
done
if [ ! $ma ]; then
echo "File is empty."
else
echo "s=$s, mi=$mi, ma=$ma"
fi
Сохраните этот сценарий в файл, и затем вы можете использовать каналы для отправки в него столько входных файлов, сколько пожелаете, например (при условии, что сценарий называется «mysum»).):
cat file1 file2 file3 | mysum
или для одного файла
mysum < file1
(Убедитесь, что сценарий является исполняемым и находится в $ PATH, в противном случае используйте «./mysum» для сценария втекущий каталог или действительно «bash mysum», если он не исполняемый.)
Сценарий предполагает, что числа по одному в строке и что в строке больше ничего нет.Выдает сообщение, если ввод пуст.
Как это работает?«Чтение x» будет принимать ввод от stdin построчно.Если файл пуст, цикл while никогда не запустится, поэтому переменные mi и ma не будут установлены.Таким образом, мы используем это в конце, чтобы вызвать соответствующее сообщение.В противном случае цикл сначала проверяет, существуют ли переменные mi и ma.Если они этого не делают, они инициализируются с первым х.В противном случае проверяется, требует ли следующий x обновления найденных миль и ма.
Обратите внимание, что этот прием гарантирует, что вы можете вводить любую последовательность чисел.В противном случае вам придется инициализировать mi с чем-то, что определенно слишком велико, и ma с чем-то, что определенно слишком мало, - что работает, пока не встретится странный список чисел.
Обратите внимание, что это работает только для целых чисел.Если вам нужно работать с плавающей точкой, вам нужно использовать другой инструмент, отличный от оболочки, например, awk.
Просто для удовольствия, вот версия awk, однострочная, используйте как есть или всценария, и он также будет работать с числами с плавающей точкой:
cat file1 file2 file3 | awk 'BEGIN{s=0}; {s+=$1; if(length(mi)==0)mi=$1; if(length(ma)==0)ma=$1; if(mi>$1)mi=$1; if(ma<$1)ma=$1} END{print s, mi, ma}'
или для одного файла:
awk 'BEGIN{s=0}; {s+=$1; if(length(mi)==0)mi=$1; if(length(ma)==0)ma=$1; if(mi>$1)mi=$1; if(ma<$1)ma=$1} END{print s, mi, ma}' < file1
Недостаток: если не выдает сообщение об ошибке для пустого файла.