在Bash采购日期时间

时间:2015-01-11 23:36:03

标签: bash scripting

我需要编写一个Bash脚本来源几个小时的另一个脚本(配置脚本)。如果配置脚本中提到的小时与Linux过去一小时匹配,则需要打印小时。

$ cat ConfHours.sh
#!/bin/bash --

Hours=(0 1 2 22 23)

$ cat Foo.sh

#!/bin/bash --
source /home/Geo/ConfHours.sh
arrayHours=( ${HOURS} )
for v in "${arrayHours[@]}"
do
HOUR=$(( $(date +%H) -1))
if [ "${HOUR}" == "v" ] ; then
HOUR = ${HOUR}
echo $HOUR
fi
done

当我运行Foo.sh时,我什么都没得到。你能纠正我错在哪里吗?

1 个答案:

答案 0 :(得分:2)

一些错误:

source /home/Geo/ConfHours.sh
arrayHours=( ${HOURS} )

ConfHours定义了一个名为Hours的变量 - 不同的变量

for v in "${arrayHours[@]}"
do
HOUR=$(date -d "1 hour ago" +%H)

每次循环都不需要定义它:将它放在for语句之前

if [ "${HOUR}" == "v" ] ; then
  • $变量
  • 缺少v
  • $ HOUR将包含前导0(由于%H
  • 更好的测试:if (( 10#$HOUR == 10#$v ))
HOUR = ${HOUR}

=周围没有空格允许变量赋值。你为什么试图将变量重新定义为自己?

echo $HOUR
fi
done

测试数组包含值的一种更简洁的方法是利用数组字符串连接和模式匹配:

source ConfHours.sh
hour=$(date +%k)           # leading space, not leading zero
if [[ " ${Hours[*]} " == *" ${hour# } "* ]]; then 
    echo "$hour"
fi

所有空格和引号都是必需的。

请勿使用UPPER_CASE_VARS:here's why