Bashスクリプトオプションパラメータをオプションで作成できますか?

Bashスクリプトオプションパラメータをオプションで作成できますか?

これらの入力のいずれかが機能することを願っています。つまり、-nオプション自体はオプションです。私はすでにこれを行う方法を知っています。ただし、上部にオプションのパラメータがある可能性があります。引数が指定されない場合、代替値が適用されます。

command -n 100
command -n

電子入力タイプまたは後者のみが機能するようにすることはできますが、どちらも機能することはできません。

HAS_NICE_THINGS=0
NICE_THINGS=50       # default value.

while getopts n: option; do
#while getopts n option; do    # NICE_THINGS would always be that default value.
#while getopts nn: option; do    # same.
    case "${option}" in
    n)
        HAS_NICE_THINGS=1
        if [[ ! -z "${OPTARG}" ]] && (( "${OPTARG}" > 0 )) && (( "${OPTARG}" <= 100 )); then
            NICE_THINGS=${OPTARG}
        fi;;
    esac
done

# error message:
# option requires an argument -- n

私のスクリプトにブールが必要かどうかは完全にはわかりませんが、これまではもし備えてHAS_NICE_THINGS一つ( )を記録しています。

私の究極の目標は、最終的に画像を保存するときにJPG品質を設定することです。しかし、この構造が他の場所でも役に立つと思います。

私はとUbuntu 18.04.5を使用していますGNU bash, version 4.4.20(1)-release (x86_64-pc-linux-gnu)

ベストアンサー1

Bash / POSIXと比較してそれほどスマートではありませんが、getoptsutil-linuxまたはBusyboxで "enhancement"(sなし)を使用してgetoptこれを実行できます。 (それはすべてです。特に多くの「伝統的な」getopt実装も壊れているからです。空白も壊れています。)

マニュアルページには次のように表示されますgetopts

オプションの文字列認識するオプション文字が含まれています。文字の後にコロンが続く場合、オプションには引数が必要で、スペースで区切る必要があります。

オプションのオプションパラメータについては言及していません。

もちろん、デフォルト以外の値を提供する別のオプションオプションを使用することもできます。たとえば、-nパラメータを使用せずに良い機能のみを有効にし、パラメータを使用して-N <arg>良い機能を有効にし、値を設定します。

たとえば、次のようになります。

#!/bin/bash
HAS_NICE_THINGS=0
NICE_THINGS_VALUE=50
        
while getopts nN: option; do
    case "${option}" in
    n)
        HAS_NICE_THINGS=1
        shift;;
    N)
        HAS_NICE_THINGS=1
        NICE_THINGS_VALUE=$OPTARG
        shift; shift;;
    esac
done

if [ "$HAS_NICE_THINGS" = 1 ]; then
    echo "nice things enabled with value $NICE_THINGS_VALUE"
fi

減らす

$ bash nice-getotps.sh -n
nice things enabled with value 50
$ bash nice-getopts.sh -N42
nice things enabled with value 42

util-linuxはgetoptデュアルコロン構文を使用してオプションのオプションパラメータを取得します。使い方が少しぎこちなくて処理が必要ですevalが、正しく行うと正常に動作するようです。

マニュアルページ:

-o shortopts[...]の各短いオプション文字近道必須パラメータがあることを示すコロンと、オプションのパラメータがあることを示す2つのコロンが続くことがあります。

スクリプトを使用して元の値を印刷すると、正しく機能していることを確認できます(getopt-optional.sh)。

#!/bin/bash
getopt -T
if [ "$?" -ne 4 ]; then
    echo "wrong version of 'getopt' installed, exiting..." >&2
    exit 1
fi 
params="$(getopt -o an:: -- "$@")"
eval set -- "$params"
while [ "$#" -gt 0 ]; do
    case "$1" in
    -n)
        echo "option -n with arg '$2'"
        shift 2;;
    -a)
        echo "option -a"
        shift;;
    --) 
        shift
        break;;
     *) 
        echo "something else: '$1'"
        shift;;
    esac
done
echo "remaining arguments ($#):"
printf "<%s> " "$@"
echo

私達は得た

$ bash getopt-optional.sh -n -a
option -n with arg ''
option -a
remaining arguments (0):
<> 
$ bash getopt-optional.sh -n'blah blah' -a
 -n 'blah blah' -a --
option -n with arg 'blah blah'
option -a
remaining arguments (0):
<> 

-n空のパラメータとして表示するパラメータはありません。

いずれにせよ、明示的なnull引数を渡すことはできません。オプション引数は、オプション自体と同じコマンドライン引数内になければならず、-n引用符を削除した後の引数と同じでなければならないためです。これにより、オプションのオプション引数を使用するのが難しくなります。これは、オプション引数なしでオプションとして扱われ、オプションではなく一般的なコマンドライン引数が続くため、-n""使用する必要があるためです。これは、必須オプションパラメータを使用したときに発生するものとは異なります。-nx-n x-nx-n

詳しくはgetoptこちらこのStackoverflowの答え到着Bashでコマンドライン引数を解析する方法は?


getoptこれは、Linuxシステムでは一般的ですが、他のシステムでは一般的ではない可能性がある特定の実装に限定されているようです。他の実装では、getopt引数はスペースをサポートしない可能性があります(プログラムはスペースを引用符で囲む必要があります)。 「アップグレードされた」util-linuxバージョンには、特定のバージョンがインストールされて-Tいるかどうかをテストするオプションがあります。以下は、制限事項と注意事項の説明ですgetoptgetopt、getopts、または手動解析 - 短いオプションと長いオプションの両方をサポートするには何を使用する必要がありますか?

また、getoptこれは標準的なツールではありませんgetopts

おすすめ記事