Как выполнить указанный codeblock с getopts, когда никакие опции или аргументы не предоставляются?

Для Red Hat Enterprise Linux и производные:

$ yum install foo

Для Fedora:

$ dnf install foo

Для Debian и производных, таких как Ubuntu (выполняет это как корень):

# apt-get install foo

3
24.01.2012, 14:09
1 ответ

Можно использовать любое из следующих к командам выполнения когда $1 пусто:

[[ ! $1 ]] && { COMMANDS; }
[[ $1 ]] || { COMMANDS; }
[[ -z $1 ]] && { COMMANDS; }
[[ -n $1 ]] || { COMMANDS; }

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

Если Вы желаете проверить, существуют ли аргументы, тем не менее, Вы были бы лучше для использования (( $# )).

Если я понял Ваши намерения, вот то, как Ваш код мог быть написан с getopts:

#!/bin/bash

(( $# )) || printf '%s\n' 'No arguments'

while getopts ':n:h' opt; do
    case "$opt" in
        n)
            [[ $OPTARG ]] && printf '%s\n' "Commands were run, option $OPTARG, so let's do what that says."
            [[ ! $OPTARG ]] && printf '%s\n' "Commands were run, there was no option, so let's run some stuff."
            ;;
        h) printf '%s\n' 'Help printed' ;;
        *) printf '%s\n' "I don't know what that argument is!" ;;
    esac
done
3
27.01.2020, 21:24
  • 1
    Используя-n или-z имеет тот же эффект. Проигнорирован ли я, тип./сценарий или./сценарий-n 3, тот же codeblock выполняется и все в getopts цикле. –  MaQleod 15.09.2011, 19:37
  • 2
    Это просто не возможно- -z оценит к истинному если $1 пусто. Каков наименьший пример кода, который демонстрирует проблему, которую Вы имеете непосредственно? –  Chris Down 15.09.2011, 19:40
  • 3
    я действительно вставлял его неправильно в скрипте, который я запускаю, у меня есть он набор по-другому, я исправил это в вопросе, но у меня нет проблем с getopts циклом. Я обновил с примером, и это - вероятно, что-то в моем синтаксисе, который мешает ему работать правильно. Я попробовал все различные варианты, которые Вы отправили в своем ответе, и всем не удалось работать правильно. –  MaQleod 15.09.2011, 19:54
  • 4
    Вышеупомянутый код должен показать Вам, как реализовать проверку ситуации, где существует также a.) никакие аргументы или b.) аргументы без опции. –  Chris Down 15.09.2011, 20:01
  • 5
    Неважно, как я делаю это, предоставляется ли возможность или нет, код выполняет CODEBLOCK1. Единственное различие с первой опцией [[! 1$]] && {КОМАНДЫ;}, это выполняет CODEBLOCK2 как ожидалось, но никогда не будет выполнять CODEBLOCK1, это производит ошибку: [[: не найденный. Я даже протестировал его с (($ #)) || и имел то же как большинство других. –  MaQleod 15.09.2011, 20:06

Теги

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