4

我编写了一个仅在工作时间执行 curl 调用的 bash 脚本。出于某种原因,当我添加“-a”运算符时,每小时比较失败(并且由于某种原因,我的 bash 无法识别“&&”)。

虽然脚本要大得多,但这里是相关的部分:

HOUR=`date +%k`

if [ $HOUR > 7 -a $HOUR < 17 ];
then
  //do sync
fi

该脚本给了我错误:

./tracksync: (last line): Cannot open (line number): No such file

但是,这种比较不会失败:

if [ $DAY != "SUNDAY" -a $HOUR > 7 ];
then
  //do sync
fi

我的语法错误还是我的 bash 有问题?

4

4 回答 4

14

您不能像这样在 bash 脚本中使用<and 。>使用-ltand-gt为此:

if [ $HOUR -gt 7 -a $HOUR -lt 17 ]

<并被>shell 用来执行标准输入或标准输出的重定向。

您所说的比较有效实际上是7在当前目录中创建一个名为的文件。

至于&&,这对 shell 也有特殊含义,用于创建命令的“与列表”。

所有这些的最佳文档:(man bash以及man test有关比较运算符的详细信息)

于 2012-01-09T16:00:41.883 回答
6

这里有一些答案,但没有一个推荐实际的数字上下文。

以下是如何在 bash 中执行此操作:

if (( hour > 7 && hour < 17 )); then
   ...
fi

请注意,在数字上下文中扩展变量不需要“$”。

于 2012-01-09T16:34:10.723 回答
0

我建议您在变量引用和“标准”运算符周围使用引号:

if [ "$HOUR" -gt 7 -a "$HOUR" -lt 17 ]; ...; fi
于 2012-01-09T16:01:06.893 回答
0

尝试[[改用,因为它更安全且具有更多功能。也可以使用-gtand-lt进行数字比较。

if [[ $HOUR -gt 7 && $HOUR -lt 17 ]]
then
    # do something
fi 
于 2012-01-09T16:01:15.213 回答