Bash中的寻源日期小时
我需要编写一个Bash脚本,在几个小时内生成另一个脚本(配置脚本)。如果配置脚本中提到的小时数与Linux过去的小时数匹配,则需要打印小时数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=$((
$ 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