【问题标题】:Bash: How can I check the return value of a commandBash:如何检查命令的返回值
【发布时间】:2016-07-25 05:51:23
【问题描述】:

我是 bash 脚本的新手,想写一个简短的脚本来检查某个程序是否正在运行。如果它运行,脚本应该把窗口带到前台,如果它没有运行,脚本应该启动它。

#!/bin/bash

if [ "$(wmctrl -l | grep Wunderlist)" = ""]; then
    /opt/google/chrome/google-chrome --profile-directory=Default --app-id=ojcflmmmcfpacggndoaaflkmcoblhnbh
else
    wmctrl -a Wunderlist
fi

我的比较是错误的,但我什至不确定我应该用谷歌搜索什么来找到解决方案。我的想法是,如果窗口不存在,"$(wmctrl -l | grep Wunderlist)" 将返回一个空字符串。运行脚本时出现此错误:

~/bin » sh handle_wunderlist.sh                                       
handle_wunderlist.sh: 3: [: =: argument expected

【问题讨论】:

  • shellcheck.net 会发现你的语法错误;不要使用 sh 执行 Bash 脚本,因为 sh 不是(总是)Bash。

标签: bash scripting conditional


【解决方案1】:

[ (test) 命令的结束参数 ] 前需要一个空格:

if [ "$(wmctrl -l | grep Wunderlist)" = "" ]; then
    ....
else
    ....
fi

附带说明一下,您已将 shebang 用作 bash,但使用 sh 运行脚本(可能是 dash,来自错误消息)。

【讨论】:

  • 缺少空格...谢谢,问题解决了
  • ++ 用于解释语法问题并指出不应使用sh 执行 Bash 脚本;退一步看大局:John1024 的方法是最佳选择。
  • 脚本本身符合 POSIX 标准,因此可以使用 sh 运行。 (shebang 仅在将脚本本身作为命令运行时才相关。如果是这种情况,#!/bin/sh 就足够了。)
【解决方案2】:

替换:

if [ "$(wmctrl -l | grep Wunderlist)" = ""]; then

与:

if ! wmctrl -l | grep -q Wunderlist; then 

grep 将其退出条件设置为 true (0) 是找到匹配项,否则设置为 false (1)。因为你想要它的反转,我们将! 放在命令的开头以反转退出代码。

通常,grep 会将匹配的文本发送到标准输出。我们不想要那个文本,我们只想知道是否匹配。因此,我们添加了-q 选项以使grep 安静。

示例

为了说明grep -qif 语句中的使用:

$ if ! echo Wunderlist | grep -q Wunderlist; then echo Not found; else echo Found; fi
Found
$ if ! echo Wunderabcd | grep -q Wunderlist; then echo Not found; else echo Found; fi
Not found

【讨论】:

  • 感谢您详尽的回答!
猜你喜欢
  • 2017-08-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-05
  • 1970-01-01
  • 1970-01-01
  • 2019-11-14
  • 2020-03-02
相关资源
最近更新 更多