私はGnu / Linuxとbashに初めてアクセスし、事前定義された時間範囲内にあるかどうかをテストするための単純なbashスクリプトを書こうとしましたが、date +%H
成功しませんでした。
例:
hour='date +%H'
if [[ $hour -ge 12 ]] || [[ $hour -lt 19 ]]
then echo "Good afternoon!"
これに対して行を分離しようとすると、「予想整数式」が発生します。
test $hour -ge 12
$hourを整数で返したり、文字列として扱うなど、単純な内容が欠けているようです。
編集:これは完成したスクリプトです。基本レベルで必要な改善はありますか?
!#/bin/bash
name=$(whoami)
hour=$(date +%H)
if [ $hour -lt 5 ] || [ $hour -ge 19 ]
then xmessage -center "Good evening $name!"
elif [ $hour -ge 5 ] && [ $hour -lt 12 ]
then xmessage -center "Good morning $name!"
else xmessage -center "Good afternoon $name!"
fi
答え1
date +%H
変数にリテラル文字列を割り当てていますhour
。
このコマンドを実行してdate
割り当てます。出力、hour
コマンド置換を使用します。
hour=$(date +%H)
または最近リリースされたbash
シェル(4.2+)を介して
printf -v hour '%(%H)T' -1
それを使わずに同じことをしますdate
。
また、正しいロジックを取得するには、fi
次の手順に従って(「or」)代わりに(「and」)をif
使用する必要があります。&&
||
if [ "$hour" -ge 12 ] && [ "$hour" -lt 19 ]; then
echo 'Good afternoon'
fi
ここでは、値が無効な8進数(合計)として解釈される問題(およびテストによって導入された算術コンテキストで)を回避するために、シェルセルフテストではなく[ ... ]
標準テストを使用しています。bash
[[ ... ]]
$hour
-ge
-lt
08
09
値を使用する必要があると思われる場合は、問題を回避するために修正せずに[[ ... ]]
テストできます。の値は単一の先行を削除するのと同じです。${hour#0}
$hour
${hour#0}
$hour
0
if [[ ${hour#0} -ge 12 && ${hour#0} -lt 19 ]]; then
echo 'Good afternoon'
fi
答え2
((...))
Bashは算術演算の構文もサポートしています。コードは次のように書き直すことができます。
#!/bin/bash
declare -i hour=$(date +%k)
if (( hour > 12 && hour < 19 ))
then
printf "Good afternoon\n"
fi
この行は、declare -i hour=$(date +%k)
変数がhour
算術整数として処理され、現在時刻(0〜23)がゼロなしで前に割り当てられることを指定します。