Я написал следующий скрипт 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
в конце?!
$1
— это-n
, а не... то, что вы ожидаете. Делает проблему довольно ясной, не так ли? Итак, кем ты хочешь$1
быть? - person Charles Duffy   schedule 04.04.2021getopts
при использовании методов, описанных в BashFAQ #35, выshift
отключаете все аргументы, проанализированные как опции, и это работает последовательно даже на платформах, отличных от GNU). - person Charles Duffy   schedule 04.04.2021shift $((OPTIND-1))
послеgetopts
? - person Charles Duffy   schedule 04.04.2021