我需要在 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
然后...就这样。