I wrote the following bash script to print the top and bottom rows of a CSV file as a table.
#!/usr/bin/env bash
# Default argument
num=10
# Get flag values
while getopts ":n:" opt; do
case $opt in
n)
# Get argument values
num=$OPTARG
# Print to check
echo $num
;;
esac
done
column -t -s , <(head -n $((num+1)) $1) <(tail -n $num $1)
By default, I set the number of top and bottom rows to be shown at 10. The script runs fine without the -n flag. When I specify the flag, however, my echo shows that num has been set correctly, but I get the following errors:
tail: option requires an argument -- 'n'
Try 'tail --help' for more information.
head: option requires an argument -- 'n'
Try 'head --help' for more information.
It seems that num isn't being seen by either tail or head. Even if I stick an echo right before that final command, I can see that num is set correctly, but clearly something is wrong. Why am I receiving these errors?
PS I use this CSV file for my testing.
Prompted by Cyrus' helpful advice, I get the following in debug mode (where ht is the name of my script):
./ht -n 5 sealevels.csv
+ num=10
+ getopts :n: opt
+ case $opt in
+ num=5
+ echo 5
5
+ getopts :n: opt
+ echo 5
5
+ column -t -s , /dev/fd/63 /dev/fd/62
++ head -n 6 -n
++ tail -n 5 -n
head: option requires an argument -- 'n'
Try 'head --help' for more information.
tail: option requires an argument -- 'n'
Try 'tail --help' for more information.
Where is that extra trailing -n coming from?!