как использовать getopt(s) в качестве метода передачи аргумента в bash

Может ли кто-нибудь показать мне пример, как правильно использовать getopts или любую другую технику, которую я мог бы передать в качестве аргумента? Я пытаюсь написать это в оболочке unix/bash. Я вижу, что есть getopt и getopts, и не уверен, что лучше использовать. В конце концов, я построю это, чтобы добавить больше возможностей.

В этом случае я хочу передать путь к файлу в качестве входных данных для сценария оболочки и поместить описание в случае, если оно было введено неправильно.

export TARGET_DIR="$filepath"

Например: (вызов в командной строке)

./mytest.sh -d /home/dev/inputfiles

Сообщение об ошибке или запрос на правильное использование, если он работает следующим образом:

./mytest.sh -d /home/dev/inputfiles/

person jdamae    schedule 26.07.2011    source источник
comment
вы можете специально проверить, есть ли у папки косая черта в конце, существует ли она и является ли она вообще папкой - все независимо от вашего метода разбора аргументов   -  person lunixbochs    schedule 26.07.2011


Ответы (2)


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

Пример оболочки с довольно полной проверкой ошибок:

#!/bin/sh

usage () {
  echo "usage: $0 -d dir_name"
  echo any other helpful text
}

dirname=""
while getopts ":hd:" option; do
  case "$option" in
    d)  dirname="$OPTARG" ;;
    h)  # it's always useful to provide some help 
        usage
        exit 0 
        ;;
    :)  echo "Error: -$OPTARG requires an argument" 
        usage
        exit 1
        ;;
    ?)  echo "Error: unknown option -$OPTARG" 
        usage
        exit 1
        ;;
  esac
done    

if [ -z "$dirname" ]; then
  echo "Error: you must specify a directory name using -d"
  usage
  exit 1
fi

if [ ! -d "$dirname" ]; then
  echo "Error: the dir_name argument must be a directory
  exit 1
fi

# strip any trailing slash from the dir_name value
dirname="${dirname%/}"

Документацию по getopts см. в руководстве по bash.

person glenn jackman    schedule 26.07.2011
comment
Спасибо. Сначала это не сработало, но у меня была логика getopts в функции, а не в основном теле. - person asgoth; 10.09.2013

Исправление к строке ':)':

:)  echo "Error: -$OPTARG requires an argument"

потому что, если после флага не указано значение, тогда OPTARG получает имя флага, а для флага устанавливается значение «:», которое в приведенном выше примере напечатано:

Error: -: requires an argument

что не было полезной информацией.

То же самое относится к:

\?)  echo "Error: unknown option -$OPTARG"

Спасибо за этот образец!

person pBi    schedule 11.07.2013