OS X:如何在 bash 函数中获取当前网络位置?

OS X:如何在 bash 函数中获取当前网络位置?

我需要在 bash 脚本条件中使用当前网络位置。我尝试使用该scselect命令,它会在当前位置旁边输出一个星号:

~/ scselect 
Defined sets include: (* == current set)
   70209F72-5BE9-44D1-979E-A8BA25A317B4 (Office)
 * BDF51A74-6547-4747-BD21-30C51DA26CB1 (Automatic)

这不起作用:

#!/bin/bash
if [ `scselect | grep "*.*Automatic"` ]; then
    ...
fi

由于*输出中的scselect扩展到当前目录中的文件名列表。

答案1

awk去救援。

$ scselect | awk '{if ($1=="*") print $3}'
(Automatic)

如果您愿意,您还可以使用它sed来去掉括号。

$ scselect | awk '{if ($1=="*") print $3}' | sed 's/[()]//g'
Automatic

答案2

你可以用 来转义*\另外,至少在 Snow Leopard 上, 似乎scselect将定义的集合输出到 stderr 而不是 stdout,因此你可能需要将 stderr 重定向到 stdout:

scselect 2>&1 | grep "\*.*Automatic"

答案3

这:

if [ `scselect | grep "*.*Automatic"` ]; then

意思是:运行 scselect 命令,并 grep *.*Automatic,这是一个无效的正则表达式。星号是表达式中前一个原子(“事物”)的修饰符,因此它不能是第一个事物。

如果您想要匹配实际的星号,则必须使用反斜杠将其转义。

Spiff 建议这样做,但使用双引号不会传递反斜杠,您必须使用单引号或双反斜杠。困惑了吗?:)

因此结果为:

if [ `scselect | grep '\*.*Automatic'` ]; then

这意味着,运行 scselect 命令,找到与 *.*Automatic 匹配的行并输出它,然后将其用作“test”命令(也称为“[”)的参数。

测试命令不将 scselect 的一行输出作为参数。

您真正要做的是根本不使用测试命令:

if scselect | grep '\*.*Automatic'; then

但是正如 Spiff 提到的,由于某些愚蠢的原因,scselect 将其输出发送到 stderr 而不是 stdout。

因此现在你得到的结果是:

if scselect 2>&1 | grep '\*.*Automatic'; then

它工作得很好,但是仍然将 grep 给我们的那一行发送到 STDOUT,我们可能不希望它出现在我们的输出中,所以让我们修复它:

if scselect 2>&1 | grep '\*.*Automatic' >/dev/null 2>&1; then

然后...就这样。

相关内容