基于环境的返回构造一个 If 语句$PATH通过 grep(使用 bash)管道传输



我在写这篇文章时已经回答了我自己的问题,但它可能对其他人有所帮助,因为我在其他任何地方都找不到直接的答案。如有不当,请删除。

我正在尝试构造一个 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

最新更新