2021年4月3日星期六

Variable set by bash flag cannot be used by another command

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?!

https://stackoverflow.com/questions/66937615/variable-set-by-bash-flag-cannot-be-used-by-another-command April 04, 2021 at 10:48AM

没有评论:

发表评论