パラメータなしでスイッチを処理する方法は?

パラメータなしでスイッチを処理する方法は?

いくつかのUSBウェブカメラ画像設定とWebカメラサービスを再起動するための簡単なbashスクリプトを書いています。

この時点で、誰かが-tフラグを使用すると、「n」または「d」のみを使用できます。他のものを使用するとエラーが発生します。ただし、引数なしで-tを使用すると同じエラーが発生します。

これら2つを別々に処理する方法はありますか?

また、私が使用する方法とは異なる方法で複数の変数を含む"case"ステートメントを使用する方法はありますか?

VBAで何ができるのか疑問に思います。

Select Case True
    Case a = 1 and b = 2
        *something something*
    Case a = 2 and b = 1
        *something something*
End Select

ありがとう

#!/bin/bash

RESTART="The camera was restarted."
RESTARTDAY="The camera was restarted and controls were set for daytime."
RESTARTNIGHT="The camera was restarted and controls were set for nighttime."
DAY="The camera controls were set for daytime."
NIGHT="The camera control were set for nighttime."
REST=false
TIME=false

unstuck_image(){

v4l2-ctl -c brightness=10
v4l2-ctl -c contrast=10
v4l2-ctl -c gamma=10
v4l2-ctl -c saturation=10
v4l2-ctl -c sharpness=10

}

set_night(){

v4l2-ctl -c gain_automatic=0
v4l2-ctl -c brightness=75
v4l2-ctl -c contrast=75
v4l2-ctl -c gamma=20
v4l2-ctl -c saturation=15
v4l2-ctl -c sharpness=90

}

set_day(){

v4l2-ctl -c gain_automatic=0
v4l2-ctl -c brightness=50
v4l2-ctl -c contrast=50
v4l2-ctl -c gamma=20
v4l2-ctl -c saturation=15
v4l2-ctl -c sharpness=90

}

restart_camera(){

sudo service webcamd restart

}

while getopts :rt: option
do
    case "${option}" in
        r)
            REST=true
            #echo "Restart"
            ;;
        t)
            TIMEOFDAY=${OPTARG}
            TIME=true
            case "$TIMEOFDAY" in
                n | d)
                    #echo "$TIMEOFDAY"
                    ;;
                *)
                    echo "Invalid argument for -t, use only 'd' or 'n'"
                    exit 0
                    ;;
            esac
            ;;
        *)
            echo "Argument -${OPTARG} not found."
            echo "Use only -r and -t."
            exit 0
            ;;
    esac
done

RESTTIME="$REST""$TIME"
#echo "$RESTTIME"
#echo "$RESTART"

case "$RESTTIME" in
    "truefalse") #Only restart webcamd
        restart_camera
        MESSAGE="$RESTART"
        ;;
    "truetrue") #Restart webcamd and set camera controls
        case "$TIMEOFDAY" in
            d)
                restart_camera
                unstuck_image
                set_day
                MESSAGE="$RESTARTDAY"
                ;;
            n)
                restart_camera
                unstuck_image
                set_night
                MESSAGE="$RESTARTNIGHT"
                ;;
        esac
        ;;
    "falsetrue") #Only set the camera controls
        case "$TIMEOFDAY" in
            d)
                unstuck_image
                set_day
                MESSAGE="$DAY"
                ;;
            n)
                unstuck_image
                set_night
                MESSAGE="$NIGHT"
                ;;
        esac
        ;;
esac

echo "$MESSAGE"

編集する:

spuckの答えに加えて、私は自分自身の調査を行い、次のようにすることもできます。

while getopts :rt: option
do
    case "${option}" in
        r)
            REST=true
            #echo "Restart"
            ;;
        t)
            TIMEOFDAY="${OPTARG}"
            TIME=true
            case "${TIMEOFDAY}" in
                n | d)
                    #echo "$TIMEOFDAY"
                    ;;
                "")
                    echo "-t argument requires an option. Use 'd' or 'n'."
                    exit 2
                    ;;
                *)
                    echo "Invalid argument for -t. Use only 'd' or 'n'"
                    exit 0
                    ;;
            esac
            ;;
        \?)
            echo "Argument -"${OPTARG}" not found. Use only -r and -t."
            exit 0
            ;;
        :)
            echo "Invalid option: -"${OPTARG}" requires an argument"
            exit 2
            ;;
    esac
done

ここで :) は、フラグの引数がオプションではないが欠落している場合を処理します。

ベストアンサー1

あなたの使用はgetopts :rt:シェルです必要オプション 't' の引数です。

getoptsのマニュアルページから:

[...] 文字の後にコロンが続く場合、オプションには引数が必要で、スペースで区切る必要があります。 [...]オプションに引数が必要な場合、getoptsは引数を変数OPTARGに入れます。

-t引数をオプションで使用するには、コロンを削除して次の引数を手動で処理する必要があります。

while getopts :rt option
do
    case "${option}" in
        r)
            REST=true
            #echo "Restart"
            ;;
        t)
            TIMEOFDAY=${!OPTIND}
            TIME=true
            case "$TIMEOFDAY" in
                n | d)
                    echo "$TIMEOFDAY"
                    ;;
                "")
                    echo "-t argument requires an option."
                    exit 2
                    ;;
                *)
                    echo "Invalid argument for -t, use only 'd' or 'n'"
                    exit 0
                    ;;
            esac
            ;;
            *)
               echo "Argument -${OPTARG} not found."
               echo "Use only -r and -t."
               exit 0
               ;;
    esac
done

コードには2つの変更があります。

  1. 「optstring」をfromからに変更すると、「t」オプションは次の引数が必要ないことをgetoptsに:rt:通知します。:rt
  2. TIMEOFDAY=${OPTARG}をに変更しますTIMEOFDAY=${!OPTIND}

もう一度マニュアルページから:

各呼び出しで、getoptsユーティリティは、nameオペランドで指定されたシェル変数に次のオプション値を配置し、シェル変数OPTINDによって処理される次の引数のインデックスを配置する必要があります。

したがって、「t」オプションが処理されると、OPTIND変数はそのオプションのインデックス番号を持ちます。オプション。構文 ${!変える} 間接参照の値変える

ここで説明するのに役立つように、サンドボックスでそれを再生成し、OPTIND値を反映する別の行を追加しました。オンラインでお試しください!

おすすめ記事