我在写这篇文章时已经回答了我自己的问题,但它可能对其他人有所帮助,因为我在其他任何地方都找不到直接的答案。如有不当,请删除。
我正在尝试构造一个 if 语句,具体取决于是否在环境中找到一些<STRING>
$PATH
.
当我通过 grep 管道$PATH时,我得到了成功的命中:
echo $PATH | grep -i "<STRING>"
但我真的很难找到围绕此构建 if 语句所需的语法。下面的行似乎有效。我知道$(...)
本质上将内部命令传递给 if 语句,但我不确定为什么需要[[...]]
双括号:
if [[ $(echo $PATH | grep -i "<STRING>") ]]; then echo "HEY"; fi
也许有人可以解释一下,以便我更好地理解。
谢谢。
你可以更好地利用shell语法。像这样:
$ STRING="bin"
$ grep -i $STRING <<< $PATH && echo "HEY"
也就是说:首先,将搜索字符串保存在一个变量中(我称之为STRING
,以便于记忆(,并将其用作搜索模式。然后,使用<<<
重定向输入"此处字符串" - 即PATH
变量。
或者,如果您不需要字符串的变量:
$ grep -i "bin" <<< $PATH && echo "HEY"
然后,构造&& <some other command>
意味着:如果grep
的退出状态为 0(意味着至少一个成功的匹配(,然后执行"其他命令"(否则什么都不做 - 只需在完成后立即退出grep
(。这是"如果...然后..."陈述,正是你想写的那种。
不过问题要问你。为什么是-i
旗?这意味着"与大小写无关的匹配"。但是在Unix和Linux文件名中,命令名称等区分大小写。你为什么关心 PATH 是否与字符串BIN
匹配?它会的,因为bin
在路径上的某个地方,但是如果您随后搜索BIN
目录,您将找不到。(更有趣的问题是 - 如何只匹配完整的单词,以便例如匹配bin
,应该存在目录名称bin
;sbin
不应该与bin
匹配.但这是关于编写正则表达式 - 不完全是你问的。
以下版本 - 甚至不使用grep
- 基于相同的想法,但它不会进行不区分大小写的匹配:
$ [[ $PATH == *$STRING* ]] && echo "HEY"
[[ ... ]]
计算一个布尔表达式(此处为右侧使用 * 通配符的相等(;如果为 true,则&&
导致执行echo
命令。
你不需要使用[[ ]],只需:
if echo $PATH | grep -qi "<STRING>"; then echo "HEY"; fi