Apenas para ajudar você a começar, salve em um arquivo e defina o modo de execução e execute-o em um terminal. Veja a saída e compare-a com o script. Veja se você consegue entender como isso se relaciona. Use a referência que já foi sugerida para ajudar.
#!/bin/bash
if [[ $# != 1 ]]
then
echo usage $0 "<table_to_check>"
exit 1
fi
error=""
firstline=1
{
while read line # loop through the lines
do
# check syntax of "line"
if(($firstline))
then
#check first line syntax
echo information row=$line # debug
# ... your method here. Assign to error if something is wrong...
firstline=0 # ready for next line/loop which should be data
else
#check other lines
echo data row=$line # debug
# ... your method here. Assign to error if something is wrong...
fi
if [[ $error != "" ]] # assign any error in the data as a string message you can then print here and exit
then
echo $error
exit 2
fi
done
} < "$1"
exit 0 # no error
Para implementar as verificações de campo, talvez dê uma olhada em cut
para dividir a linha em tokens individuais, por exemplo, na linha de informações:
number_of_rows='echo $line | cut -d':' -f2'
e dada a amostra, $ number_of_rows deve conter "3"
Então, para verificar isso, você pode usar um contador que é incrementado em cada loop:
rowcount=$[rowcount+1]
Quando não houver mais dados, $ rowcount deve ser igual a $ number_of_rows, então:
if (( $rowcount != $number_of_rows ))
then
error="number of rows doesn't agree"
# ... etc ...
Algo parecido com isso.
Outros métodos estão disponíveis, é claro