0

我负责检查应用程序是否正在运行的“if”语句不起作用。它总是返回“false” 这是一个 script.sh:

#!/bin/bash
    osascript -e "do shell script \"

        if (ps aux | grep "[[S]kype]" > /dev/null)
        then
            echo "RUNNING" > /Users/someuser/Desktop/RUNNING.txt
        else
            echo "STOPPED" > /Users/someuser/Desktop/STOPPED.txt
        fi

    \" with administrator privileges"

结果脚本即使启动应用程序也会创建“STOPPED.txt”。

如何解决以下问题?

请注意,我只能更改“IF”语句。

4

1 回答 1

1

这里有几个问题。您没有在帖子中指定它,但您似乎专门寻找应用程序“Skype”。然而,方括号在 grep 中具有特殊含义:它们表示任何封闭的字符。但是,通过嵌套方括号,您基本上可以确保它不会匹配任何内容。(请参阅其他地方的Grep 歧义嵌套方括号。)

这就是为什么它总是报告“停止”,因为没有匹配的。

您可能想要更多类似的东西:

ps aux | grep "Skype"

但是,如果您运行它,您会发现它报告为 always running。这是因为这实际上会匹配 grep 本身,因为 grep 进程还包含所需的文本。要解决这个问题,您需要以某种方式从匹配列表中删除 grep 进程。(这可能是您的方括号的用途;请参阅评论。)一种方法是使用grep -v排除匹配的行:

ps aux | grep "Skype" | grep -v "grep"

这应该做你想要的。我用您的脚本的简化形式对其进行了测试,它正确地报告了命名的应用程序是否正在运行:

#!/bin/bash
osascript -e "do shell script \"

  if (ps aux | grep Skype | grep -v grep > /dev/null)
  then
      echo RUNNING
  else
      echo STOPPED
  fi

\""

请注意,虽然我简化了脚本的其余部分以使其更易于测试,但重要的更改仅在if语句中。

(还要注意,由于您的搜索不包含空格,因此搜索周围的引号是多余的;您可以通过删除它们来提高可读性。但是,拥有它们并不会损害脚本。)

于 2015-03-03T19:33:41.317 回答