Убедитесь сами, что встроенная функция wait
не будет ждать случайного процесса - только дочерние элементы текущей оболочки.
#!/bin/bash
sleep 2 &
P=$!
echo sleeping 3 seconds...
sleep 3
echo waiting for $P ...
wait $P
R=$RANDOM
echo waiting for $R ...
wait $R
echo done
$ ./t.sh
sleeping 3 seconds...
waiting for 93208... ## this returns immediately, since that PID is gone
waiting for 31941 ...
./t.sh: line 10: wait: pid 31941 is not a child of this shell
done
Вы также можете сделать это с помощью awk, избегая необходимости for head
для каждого файла:
gawk '{count += 1; sum += $1; nextfile}
END {printf "count: %d\t sum: %d\n", count, sum}' *
Первое правило увеличивает количество и сумму, а затем переходит к следующему файлу, таким образом игнорируя все, кроме первой строки каждого файла. В END
мы распечатываем числа.
nextfile
— это вещь GNU, она может не работать в других версиях awk
. Другой альтернативой может быть явная работа только с первой строкой :
awk 'FNR == 1 {count += 1; sum += $1}
END {printf "count: %d\t sum: %d\n", count, sum}' *
Это, однако, будет читать файлы полностью, даже если ничего не делать с остальными строками.
Думаю, то, что вы пытаетесь сделать, может быть достигнуто:
#!/bin/bash
sum=0
count=0
for file in "$@"
do
number=$(head -1 "$file")
count=$((count + 1))
sum=$((sum + number))
done
echo "The sum of the $count file(s) is: $sum"
Вы просто добавляете переменные для хранения sum
и count
файлов, с которыми работаете. Затем вы увеличиваете count
каждый раз, когда выполняете цикл. Также мы добавляем number
в начале строки файла к нашей переменной sum
-.