Bash 被解释为变量的整数
我正在制作一个视听艺术装置,与Raspbian Jessie一起使用Raspberry Pi。音频或视频在通过bash脚本登录后启动。此脚本本身运行良好 我的问题是试图使用if语句将循环安排为仅在一天中的特定时间运行。它被放置在循环的开头,以检查新文件开始之前的时间Bash 被解释为变量的整数,bash,variables,if-statement,syntax,integer,Bash,Variables,If Statement,Syntax,Integer,我正在制作一个视听艺术装置,与Raspbian Jessie一起使用Raspberry Pi。音频或视频在通过bash脚本登录后启动。此脚本本身运行良好 我的问题是试图使用if语句将循环安排为仅在一天中的特定时间运行。它被放置在循环的开头,以检查新文件开始之前的时间 HOUR=$(date +"%H") echo "The hour is $HOUR" if [ $HOUR -gt 22 || $HOUR-lt 8 ] then sleep 60 continue
HOUR=$(date +"%H")
echo "The hour is $HOUR"
if [ $HOUR -gt 22 || $HOUR-lt 8 ]
then
sleep 60
continue
fi
我已将HOUR
声明为一个整数,脚本开头带有declare-I HOUR
脚本输出此错误,然后继续
./start_audio.sh: line 49: 13: command not found
我认为变量设置正确,因为错误中显示了$HOUR
[13]。那么,为什么$hour
被声明为整数时会被解释为命令呢
根据对其他问题的回答,尝试了添加引号或删除空格等更改。将变量用双引号括起来(此处不要求,但作为一般最佳做法),并将检查结果一分为二,中间加一个
|
(-o通常不推荐):
或者,您可以使用[[]]
:
if [[ "$HOUR" -gt 22 || "$HOUR" -lt 8 ]]
更好的是,使用算术运算符,(…)
:
if((小时>22 | |小时<8))
相关的:
|
(-o通常不推荐):
或者,您可以使用[[]]
:
if [[ "$HOUR" -gt 22 || "$HOUR" -lt 8 ]]
更好的是,使用算术运算符,(…)
:
if((小时>22 | |小时<8))
相关的:
[
(测试
)或外部外壳不支持其结构内的短路评估操作员
您需要使用bash
关键字,[
:
[[ $HOUR -gt 22 || $HOUR -lt 8 ]]
或者将逻辑分为两部分:
[ $HOUR -gt 22 ] || [ $HOUR -lt 8 ]
当我们进行此操作时,您应该引用变量扩展以防止单词拆分和路径名扩展:
[ "$HOUR" -gt 22 ] || [ "$HOUR" -lt 8 ]
我假设
$HOUR lt 8
是一个打字错误,因为它应该是$HOUR-lt 8
外壳内置[
(测试
)或外部外壳不支持其结构内的短路评估操作符
您需要使用bash
关键字,[
:
[[ $HOUR -gt 22 || $HOUR -lt 8 ]]
或者将逻辑分为两部分:
[ $HOUR -gt 22 ] || [ $HOUR -lt 8 ]
当我们进行此操作时,您应该引用变量扩展以防止单词拆分和路径名扩展:
[ "$HOUR" -gt 22 ] || [ "$HOUR" -lt 8 ]
我假设
$HOUR lt 8
是一个打字错误,因为它应该是$HOUR-lt 8
我认为您不能在标准测试中使用|
操作符
尝试用
-o
替换|
,或者使用双括号的[[]]]
条件(bash特定)。我认为在标准测试[]
中不能使用|
操作符
尝试将
|
替换为-o
,或使用双括号的[[]]
条件(特定于bash).你能发布整个脚本吗?会自动检测到许多类似的问题。你能发布整个脚本吗?会自动检测到许多类似的问题。引用不会有什么坏处,但我认为它不会增加任何内容:如果小时变量包含空格(需要引用)如果-GT和-LT运算符也会出现不好的结果,如果不能相信日期命令只返回数字,那么在尝试比较之前必须检查它。@弗莱德考虑<代码>小时= FoO o 3 < /Cl>。如果不引用代码> $小时<代码>,则<代码>[成功,尽管$HOUR
根本不是整数,更不用说小于8或大于22。正确。我总是使用双括号[[]],它们没有遇到这个问题,我忘记了单括号测试命令执行的分词。引号不会有什么坏处,但我认为它不会增加任何内容:如果HOUR变量包含空格(需要引号)如果-GT和-LT运算符也会出现不好的结果,如果不能相信日期命令只返回数字,那么在尝试比较之前必须检查它。@弗莱德考虑<代码>小时= FoO o 3 < /Cl>。如果不引用代码> $小时<代码>,则<代码>[成功,尽管$HOUR
根本不是整数,更不用说小于8或大于22。正确。我总是使用双括号[[]],它们没有遇到这个问题,我忘记了单括号测试命令执行的分词操作。-o
很久以前就被弃用了。我真的不是专家,但是-o似乎是POSIX“测试”规范的一部分命令…如果bash不赞成将该操作符用于其内部内置版本,我会感到惊讶(请参阅)-o
是POSIX规范的一个扩展,被认为是过时的。新代码不应该使用它。这只是常识,还是有一些参考源记录了这些指南?它们实际上在中被标记为“过时”(单击链接).-o
早就被弃用了。我真的不是专家,但是-o似乎是POSIX规范中“test”命令的一部分……如果bash在其内部内置版本中弃用了该操作符,我会感到惊讶(请参阅)-o
是POSIX规范的一个扩展,被认为是过时的。新代码不应该使用它。这只是常识,还是有一些参考源记录了这些指南?它们实际上在中被标记为“过时”(单击链接).-o
基本上已弃用;请改用两个命令[…]|[…]
。-o
基本上已弃用;请使用两个命令[…]|[…]。。。