【问题标题】:Error running IF statement from shell从 shell 运行 IF 语句时出错
【发布时间】:2012-11-02 02:05:45
【问题描述】:

尝试在两台机器上运行 IF 语句-

1.SunOS 5.8 Generic_Virtual sun4u sparc SUNW,Sun-Fire-V240 (bash)

2.SunOS 5.10 Generic_127112-11 i86pc i386 i86pc (tcsh)

我从 shell 运行的命令 -

if (echo 13 | grep -w date +%e>/dev/null);然后回显“现在”;菲

它在机器 1 上运行良好。但在机器 2 上出现以下错误 (tcsh)-

if:表达式语法。

如何在 tcsh 中更正此问题?我需要从 crontab 文件中运行它-

30 09 * * * if (echo 13 | grep -w date +%e>/dev/null);然后回显 “展示” ;菲

【问题讨论】:

  • 您需要使用方括号而不是括号。喜欢if [condition]; then doSomething; fi
  • @NNzz 你为什么不把它写下来作为答案?
  • @NNzz:这并不完全正确。 [ 是一个程序,它返回 0 为真,1 为假。 () 是一个子shell调用,它也应该返回一些东西。
  • @d33tah:虽然通常有一个程序 /bin/test 和一个名为 /bin/[ 的链接,但 [ 运算符自 UNIX™ System V 以来就已内置到 shell 中,甚至可能是 UNIX ™ System III(很长一段时间)。来自子 shell 的状态是在子 shell 中执行的最后一个命令的状态;在示例中,即为grep
  • 真实shell中if的语法与sea-shell中的语法不同,两者都不会相遇。使用真贝壳;不要使用贝壳(将它们留在 C 岸上)。

标签: bash shell unix if-statement tcsh


【解决方案1】:

您可能在这些机器上使用了不同的 shell,这可以解释语法错误。您在代码中使用了子 shell,在不同的 shell 上可能有不同的语法。

另外请注意,您正在将 echo 的标准输出重定向到 /dev/null,所以无论如何您都看不到任何东西。

【讨论】:

  • 重定向的重点是丢失grep的输出;唯一感兴趣的项目是退出状态,如果发现 13,它将为零(成功),如果不是,则为非零(失败)。 grep 有一些选项可以抑制输出(-q-s-q 抑制匹配时的常规输出,而-s 抑制有关丢失或不可读文件等的错误消息。
  • 如果你想在 Solaris 上使用grep -q,你必须使用/usr/xpg4/bin/grep(假设它已经安装好了)。 /bin/grep 中缺少该选项
【解决方案2】:

无论您的登录 shell 是什么,您的 cron 作业都将在 /bin/sh 下运行。

要从命令行运行它,只需先启动 /bin/sh(或者,如果您愿意,也可以启动 /bin/bash)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-26
    • 2019-01-09
    • 1970-01-01
    相关资源
    最近更新 更多