Переменная, установленная флагом bash, не может использоваться другой командой

Я написал следующий скрипт bash для печати верхней и нижней строк CSV-файла в виде таблицы.

#!/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)                                                  
                             

По умолчанию я установил количество отображаемых верхних и нижних строк равным 10. Сценарий работает нормально без флага -n. Однако, когда я указываю флаг, мой echo показывает, что num был установлен правильно, но я получаю следующие ошибки:

tail: option requires an argument -- 'n'
Try 'tail --help' for more information.
head: option requires an argument -- 'n'
Try 'head --help' for more information.
                            

Похоже, что num не видит ни tail, ни head. Даже если я вставлю echo прямо перед последней командой, я увижу, что num установлено правильно, но явно что-то не так. Почему я получаю эти ошибки?

PS Я использую этот CSV-файл для тестирования.


По совету Сайруса в режиме отладки я получаю следующее (где ht — имя моего скрипта):

./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.

Откуда взялось это дополнительное -n в конце?!


person Lyngbakr    schedule 04.04.2021    source источник
comment
Это может помочь: Как отладить сценарий bash?   -  person Cyrus    schedule 04.04.2021
comment
Итак, ваше $1 — это -n, а не... то, что вы ожидаете. Делает проблему довольно ясной, не так ли? Итак, кем ты хочешь $1 быть?   -  person Charles Duffy    schedule 04.04.2021
comment
(Лично я вообще не рекомендую использовать getopts при использовании методов, описанных в BashFAQ #35, вы shift отключаете все аргументы, проанализированные как опции, и это работает последовательно даже на платформах, отличных от GNU).   -  person Charles Duffy    schedule 04.04.2021
comment
comment
Не имеет прямого отношения к вашей проблеме, кстати, но здесь есть некоторые ошибки цитирования. Попробуйте запустить свой код через shellcheck.net и исправить то, что он находит.   -  person Charles Duffy    schedule 04.04.2021