Неожиданное поведение getopts

Debajo, Tweaksaltera la tecla dconf

/org/gnome/desktop/interface/gtk-enable-primary-paste

Puede hacer lo mismo en la terminal, ya sea a través de dconf(, p. apagarlo):

dconf write /org/gnome/desktop/interface/gtk-enable-primary-paste false

o mediante gsettings(, p. para volver a encenderlo):

gsettings set org.gnome.desktop.interface gtk-enable-primary-paste true
3
28.06.2019, 07:23
1 ответ

Похоже, вы пропустили печать сообщения, а вместо этого передали всю строку как команду для запуска. Добавьте echoперед строкой

case "$o" in
  h )
  echo "Usage:
  sh $(basename "$0") -h      Displays help message
  sh $(basename "$0") arg     Outputs...

   where:
  -h   help option
      arg  argument."
  exit 0
  ;;

Но, как правило, предпочитается стиль добавления heredoc, а не вывод многострочной строки -в виде

show_help() {
cat <<'EOF'
Usage:
    sh $(basename "$0") -h      Displays help message
    sh $(basename "$0") arg     Outputs...

     where:
    -h   help option
        arg  argument.
EOF
}

и используйте функцию show_helpдля флага -h.

Также для пустых флагов аргумента первые вызовы getopts()выходят из цикла, поэтому вы не можете иметь дескриптор внутри цикла. Проведите общую проверку пустых аргументов перед вызовомgetopts()

if [ "$#" -eq 0 ]; then
    printf 'no argument flags provided\n' >&2
    exit 1
fi

С вашим более ранним определением аргумента flag :hпредполагает, что -hне принимает никаких аргументов. Предложение :)применяется только тогда, когда вы определяете -hдля приема аргумента, т. е. когда оно определено как :h:. Только тогда вы запускаете его без передачи аргументов, код под :)выполняется. Собираем весь сценарий

#!/usr/bin/env bash

if [ "$#" -eq 0 ]; then
    printf 'no argument flags provided\n' >&2
    exit 1
fi

show_help() {
cat <<'EOF'
Usage:
    sh $(basename "$0") -h      Displays help message
    sh $(basename "$0") arg     Outputs...

     where:
    -h   help option
        arg  argument.
EOF
}

while getopts ":h:" opt; do
  case "$opt" in
    h )
    show_help
    exit 1
    ;;
    \? )
    echo "Invalid option -$OPTARG" 1>&2
    exit 1
    ;;
    : )
    echo "Invalid option -$OPTARG requires argument" 1>&2
    exit 1
    ;;
  esac
done

и запускаем его сейчас

$ bash script.sh 
no argument flags provided
$ bash script.sh -h
Invalid option -h requires argument
$ bash script.sh -s
Invalid option -s
5
27.01.2020, 21:15

Теги

Похожие вопросы