オプションまたは引数が指定されていない場合は、getoptsを使用して指定されたコードブロックを実行するにはどうすればよいですか?

オプションまたは引数が指定されていない場合は、getoptsを使用して指定されたコードブロックを実行するにはどうすればよいですか?

だから私は、パラメータのあるオプションとパラメータのないオプションを混在させるスクリプトを書いています。研究を通して、私はgetoptsがこれを行うための最良の方法であることがわかりました。私が経験している問題は、オプションや引数を指定せずに別々のコマンドセットを実行するように設定する方法を見つけることです。これが私が持っているものです:

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

引数をキャッチするためにコードの上部に次のようなものを追加しようとしましたが、オプションと引数が指定されても同じコードが実行されます(ここでは構文に問題がある可能性があります)。

[[ -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

getoptsのマニュアルページはほとんどなく、検索でgetoptsのさまざまな機能だけでなく、その洞察を提供する例も比較的ほとんど見つかりませんでした。

ベストアンサー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

おすすめ記事