
プログラムによって $input という値の形式で渡される 2 つの時間値を検証しようとしています。検証されると、時間値は SQL 挿入ステートメントで使用されます。値が範囲外の場合はエラー メッセージが表示されるため、date コマンドを使用できません。
時刻値は xx:xx のようにデータベースに渡す必要があるため、08:20 を 8:20 として渡すことはできず、00:00 から 23:59 までの有効範囲内にする必要があります。$input を分割し、awk を介して 2 つの時刻値 $startt と $finisht を導出しました。$finisht は $startt よりも大きくする必要があります。
前の基準が満たされていない場合は、正しい基準が入力されるまで、2 つの時間フィールドを持つ Zenity 入力ボックスを開きます。
今のところ、次の Bash スクリプトがありますが、動作しません。誰か助けてくれませんか?
#!/bin/bash
input=30:20,12:45
startt=$(echo $input | awk -F, -v OFS=, '{print $1}')
finisht=$(echo $input | awk -F, -v OFS=, '{print $2}')
st=`date --date="$startt" +%s`
ft=`date --date="$finisht" +%s`
let "tDiff=$ft-$st"
if [[ ! $startt =~ [0-1][0-9]:[0-5][0-9] ]] && [[ ! $startt =~ [0-2][0-3]:[0-5][0-9] ]] || [[ ! $finisht =~ [0-1][0-9]:[0-5][0-9] ]] && [[ ! $finisht =~ [0-2][0-3]:[0-5][0-9] ]] || [[ "$tDiff" -le 0 ]];
then
until [[ $b1 =~ [0-1][0-9]:[0-5][0-9] ]] || [[ ! $b1 =~ [0-2][0-3]:[0-5][0-9] ]] && [[ ! $b2 =~ [0-1][0-9]:[0-5][0-9] ]] \
|| [[ $b2 =~ [0-2][0-3]:[0-5][0-9] ]] && [[ "$tzDiff" -le 0 ]]; do
var2="$(zenity --forms --title="start_time and/or finish_time are incorrect" --text "Add a start_time and a finish_time" --separator="," \
--add-entry="WARNING! Something went wrong. Please enter a valid start_time: " \
--add-entry="WARNING! Something went wrong. Please enter a valid finish_time: ")"
b1=$(echo $var2 | awk -F, -v OFS=, '{print $1}')
b2=$(echo $var2 | awk -F, -v OFS=, '{print $2}')
tz1=`date --date="$b1" +%s`
tz2=`date --date="$b2" +%s`
let "tzDiff=$tz2-$tz1"
done
fi
echo $var2
答え1
コメント:
一部のエラー メッセージを削除するには、 を使用する必要があります
2>/dev/null
。変数の値をもっと頻繁にテストする必要があります。
複雑なテストを実行するときに
or
、and
何が必要かを確実にするために括弧を使用する必要があります。
#!/bin/bash
input=30:20,12:45
startt=$(echo $input | awk -F, -v OFS=, '{print $1}')
finisht=$(echo $input | awk -F, -v OFS=, '{print $2}')
#
# when you call date you need to redirect error messages to /dev/null
#
st=$( date --date="$startt" +%s 2>/dev/null )
ft=$( date --date="$finisht" +%s 2>/dev/null )
#
# i will compute the diff only if i have 2 values
#
if [ -n "$st" -a "$ft" ] ; then
#
# because i had 2 numbers , conversion to timestamp was good
# i will normalize value of startt / finisht
#
startt=$(date +%H:%M -d "$startt" )
finisht=$(date +%H:%M -d "$finisht" )
#
# we recompute the timestamp to be sure that the normalization does not change
#
st=$( date --date="$startt" +%s 2>/dev/null )
ft=$( date --date="$finisht" +%s 2>/dev/null )
tzdiff=$(( ft - st ))
else
tzdiff=0
fi
#
#
# test for starttt must be enclosed with ( )
# test for finisht must be enclosed with ( )
#
while [[ ( ( ! "$startt" =~ ^[0-1][0-9]:[0-5][0-9]$ ) && ( ! "$startt" =~ ^[0-2][0-3]:[0-5][0-9]$ ) ) ||
( ( ! "$finisht" =~ ^[0-1][0-9]:[0-5][0-9]$ ) && ( ! "$finisht" =~ ^[0-2][0-3]:[0-5][0-9]$ ) ) ||
( "$tzdiff" -le 0 ) ]];
do
var2="$(zenity --forms --title="start_time and/or finish_time are incorrect" --text "Add a start_time and a finish_time" --separator="," \
--add-entry="WARNING! Something went wrong. Please enter a valid start_time: " \
--add-entry="WARNING! Something went wrong. Please enter a valid finish_time: ")"
#
# we set tzdiff to zero so we are going to loop for ever if nothing the value
#
tzdiff=0
#
# if var2 is empty do nothing
#
if [ -n "$var2" ] ; then
b1=$(echo "$var2" | cut -d, -f1 )
b2=$(echo "$var2" | cut -d, -f2 )
#
# if b1 or b2 is empty do nothing
#
if [ -n "$b1" -a -n "$b2" ] ; then
tz1=$( date --date="$b1" +%s 2>/dev/null )
tz2=$( date --date="$b2" +%s 2>/dev/null )
#
# if tz1 or tz2 is empty do nothing
#
if [ -n "$tz1" -a -n "$tz2" ] ; then
startt=$(date +%H:%M -d $b1 )
finisht=$(date +%H:%M -d $b2 )
tz1=$( date --date="$b1" +%s 2>/dev/null )
tz2=$( date --date="$b2" +%s 2>/dev/null )
tzdiff=$(( tz2 - tz1 ))
fi
fi
fi
echo $var2 $startt $finisht $tzdiff
done
echo $var2 $startt $finisht $tzdiff