#!/bin/bash
# This program computes the median of a list of integers on the command line.
# If there are no arguments, then it asks the user to enter them on
# separate lines. Then it prints the median (middle
# value after sorting). If there are an even number of numbers, then
# the median is the average of the 2 middle values, rounding down
# Copy the command line into array n
i=0 # current element of n
finished=0 # 1 (true) when there is no more interactive input expected
while (($# > 0)); do
((n[i] = $1))
shift
((i++))
finished=1
done
# Else if there are no arguments then ask the user to enter some numbers
if ((!finished)); then
echo Enter some numbers, one per line. Enter a blank line when done.
while ((!finished)); do
read x
if [ "$x" == "" ]; then
finished=1
else
((n[i++]=x))
fi
done
fi
# If n is empty then give up
size=${#n[*]}
if ((size==0)); then
echo Error: at least one number is expected
exit 1
fi
# Bubble sort n
((i=size-1))
while ((i>0)); do
j=0
while ((j*n[j+1])); then #swap so n[j] <= n[j+1]
((t=n[j]))
((n[j]=n[j+1]))
((n[j+1]=t))
fi
((++j))
done
((--i))
done
# Compute the median from the middle 1 or 2 elements
((mid = size/2))
if ((size % 2 == 0)); then
((median = (n[mid] + n[mid-1]) / 2))
else
((median = n[mid]))
fi
# Print the sorted array and the median
echo The median of ${n[*]} is $median
*