Como executar um codeblock especificado com getopts quando nenhuma opção ou argumento é fornecido?

3

Então, estou escrevendo um script que mistura opções com argumentos com opções que não combinam. Da pesquisa descobri que getopts é a melhor maneira de fazer isso, e até agora tem sido simples descobrir e configurar. O problema que estou tendo é descobrir como configurá-lo de modo que, se nenhuma opção ou argumento for fornecido, execute um conjunto separado de comandos. Isso é o que eu tenho:

while getopts ":n:h" opt; do
  case $opt in
    n)
      CODEBLOCK >&2
      ;;
    h)
      echo "script [-h - help] [-n <node> - runs commands on specified node]" >&2
      exit 1
      ;;
    \?)
      echo "Invalid option: -$OPTARG" >&2
      exit 1
      ;;
    :)
      echo "Option -$OPTARG requires an argument." >&2
      exit 1
      ;;
  esac
done

Eu tentei adicionar algo assim ao topo do código para não pegar nenhum argumento, mas ele executa o mesmo código mesmo quando opções e argumentos são fornecidos (algo provavelmente está errado na minha sintaxe aqui):

[[ -n "$1" ]] || {
CODEBLOCK1
}

while getopts ":n:h" opt; do
  case $opt in
    n)
      CODEBLOCK2 >&2
      ;;
    h)
      echo "script [-h - help] [-n <node> - runs commands on specified node]" >&2
      exit 1
      ;;
    \?)
      echo "Invalid option: -$OPTARG" >&2
      exit 1
      ;;
    :)
      echo "Option -$OPTARG requires an argument." >&2
      exit 1
      ;;
  esac
done

A página man do getopts era escassa e eu encontrei relativamente poucos exemplos em pesquisas que fornecem informações sobre o getopts, sem falar em todos os vários recursos dele.

    
por MaQleod 15.09.2011 / 18:25

1 resposta

3

Você pode usar qualquer um dos itens a seguir para executar comandos quando $1 estiver vazio:

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

Além disso, você não precisa citar a expansão neste exemplo em particular, pois nenhuma divisão de palavras é realizada.

Se você quiser verificar se há argumentos, é melhor usar (( $# )) .

Se eu entendi suas intenções, aqui está como seu código poderia ser escrito com 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
    
por 15.09.2011 / 18:33