как передать другие аргументы, кроме флагов - PullRequest
1 голос
/ 23 марта 2020

Я пытаюсь выполнить мой файл, передавая абсолютный путь в качестве первого аргумента ($ 1). Я также хочу добавить флаги с этого абсолютного пути и далее, но я не знаю, как сказать optargs начинать считать с $ 2 вперед, так как если я передаю абсолютный путь как $ 1, это, кажется, нарушает getopts l oop.

Я думаю, мне нужно реализовать сдвиг для первого аргумента в следующем коде:

while getopts :lq flag; do
case $flag in
l) echo "executing -l flag"
;;
q) echo "executing -q flag"
;;
esac
done

Я не уверен, как подойти к этому. Любые советы приветствуются, спасибо.

Ответы [ 2 ]

1 голос
/ 23 марта 2020

Сохраните параметры перед аргументом файла (т. Е. Абсолютный путь). Многие стандартные команды bash следуют той же практике.

Пример:

wc -wl ~/sample.txt
ls -lR ~/sample_dir

Так что, если вы будете следовать вышеописанной практике, ваш код будет выглядеть следующим образом. Этот код работает, даже если опции не предоставлены. В общем, это желаемое поведение с опциями.

# Consider last argument as file path
INPUT_FILEPATH=${*: -1} 
echo $INPUT_FILEPATH

# Process options
while getopts :lq flag
do
case $flag in
l) echo "executing -l flag"
;;
q) echo "executing -q flag"
;;
esac
done

Пример выполнения:

bash sample. sh /home/username/try.txt

/home/username/try.txt

bash sample. sh -lq /home/username/try.txt

/home/username/try.txt
executing -l flag
executing -q flag
0 голосов
/ 23 марта 2020

getopts действительно останавливает обработку аргументов, когда видит первый не опциональный аргумент. Для того, что вы хотите, вы можете явно сместить первый аргумент, если это не вариант. Что-то вроде

if [[ $1 != -* ]]; then
    path=$1
    shift
fi

while getopts :lq flag; do
    ...
done
...