【问题标题】:Multiple -a with greater than / less than break bash script多个 -a 大于/小于中断 bash 脚本
【发布时间】:2012-01-09 15:57:00
【问题描述】:

我编写了一个仅在工作时间执行 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 有问题?

【问题讨论】:

    标签: linux bash ubuntu comparison-operators


    【解决方案1】:

    您不能在 bash 脚本中使用 &lt;&gt;。为此使用-lt-gt

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

    &lt;&gt; 被shell 用来执行标准输入或标准输出的重定向。

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

    至于&amp;&amp;,它对shell也有特殊意义,用于创建命令的“AND列表”。

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

    【讨论】:

    • 酷,不知道。感谢您的提示 = )
    • 其实你可以在[ ]中使用&lt;&gt;,但是你需要对它们进行转义或者引用以防止它们被解释为重定向,并且它们会进行字母字符串比较,而不是而不是数字比较。例如,[ 7 \&gt; 17 ] 为真,因为“7”按字母顺序排列在(“大于”)“17”之后。
    【解决方案2】:

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

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

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

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

    【讨论】:

    • 这绝对是要走的路。使用通用数学符号进行比较的图像。
    【解决方案3】:

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

    if [ "$HOUR" -gt 7 -a "$HOUR" -lt 17 ]; ...; fi
    

    【讨论】:

    • 如果我知道不会有空格或特殊字符,有什么理由这样做吗?
    • 鲁棒性(不能保证 date 命令会按照您的预期运行),并养成习惯。
    • 在 bash 中更好的是使用 [[ 代替。
    【解决方案4】:

    尝试改用[[,因为它更安全且功能更多。还可以使用-gt-lt 进行数值比较。

    if [[ $HOUR -gt 7 && $HOUR -lt 17 ]]
    then
        # do something
    fi 
    

    【讨论】:

    • @Calvin Froedge:这意味着您的脚本没有在 bash 中运行;如果你想使用像[[这样的bash扩展,你需要以#!/bin/bash而不是#!/bin/sh开头
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-04
    相关资源
    最近更新 更多