
いくつかの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つの変更があります。
- 「optstring」をfromからに変更すると、「t」オプションは次の引数が必要ないことをgetoptsに
:rt:
通知します。:rt
- 行
TIMEOFDAY=${OPTARG}
をに変更しますTIMEOFDAY=${!OPTIND}
。
もう一度マニュアルページから:
各呼び出しで、getoptsユーティリティは、nameオペランドで指定されたシェル変数に次のオプション値を配置し、シェル変数OPTINDによって処理される次の引数のインデックスを配置する必要があります。
したがって、「t」オプションが処理されると、OPTIND変数はそのオプションのインデックス番号を持ちます。次オプション。構文 ${!変える} 間接参照の値変える。
ここで説明するのに役立つように、サンドボックスでそれを再生成し、OPTIND値を反映する別の行を追加しました。オンラインでお試しください!