Bash: 如何检查命令的 return 值

Bash: How can I check the return value of a command

我是 bash 脚本编写的新手,想编写一个简短的脚本来检查某个程序是否 运行ning。如果是 运行s,脚本应该将 window 带到前台,如果不是 运行,脚本应该启动它。

#!/bin/bash

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

我的比较是错误的,但我什至不确定我应该 google 找到解决方案。我的想法是,如果 window 不存在,"$(wmctrl -l | grep Wunderlist)" 将 return 一个空字符串。当我 运行 脚本时出现此错误:

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

您需要 space 在 [ (test) 命令的结束参数 ] 之前:

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

附带说明一下,您将 shebang 用作 bash,但 运行 使用 sh 的脚本(根据错误消息推测为 dash)。

替换:

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