Bash中的寻源日期小时

Bash中的寻源日期小时,bash,scripting,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=$((

我需要编写一个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
时,我什么也得不到。你能纠正我哪里错了吗?

一些错误:

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))
变量赋值时,
=
周围不允许有空格。为什么要尝试将变量重新定义为自身

echo $HOUR
fi
done

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

source ConfHours.sh
hour=$(date +%k)           # leading space, not leading zero
if [[ " ${Hours[*]} " == *" ${hour# } "* ]]; then 
    echo "$hour"
fi
所有空格和引号都是必需的


不要使用大写变量:

HOURS
已经是一个数组。当您使用
${HOURS}
时,您仅从该数组中获取第一个值,因此
arrayHours
仅包含一个值,第一个值。如果数组中包含空格,concat测试是否存在子字符串匹配问题?我正在尝试比较前一个小时,例如,现在是23小时。我想比较配置文件中的22小时和当前Linux小时。你能告诉我怎么修改我的代码吗?当我这样做时,您的代码可以工作:hour=$($(date+%k)-1));当我在00点运行脚本时,它应该比较配置文件中的23小时。这是我更新的脚本:“${arrayHours[@]}”do hour=$($(date+%H)-1))中v的arrayHours=(${HOURS})如果[“${hour}”=“$v”;然后HOUR=${HOUR}echo$HOUR fi donelook好像你忽视了我所有的建议。你认为这能实现什么:
HOUR=${HOUR}
??回答你的问题:
hour=$(date-d“1小时前”+“%H”)
@EtanReisner,你说得很对。这个数组包含整数。
source ConfHours.sh
hour=$(date +%k)           # leading space, not leading zero
if [[ " ${Hours[*]} " == *" ${hour# } "* ]]; then 
    echo "$hour"
fi