2

Мне нужно использовать текущее сетевое расположение внутри сценария 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 который расширяется до списка имен файлов в текущем каталоге.

3 ответа3

3

awk на помощь.

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

Если вам нравится, вы также можете использовать sed чтобы раздеться.

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

Вы можете просто избежать * с помощью \ . Кроме того, похоже, что scselect , по крайней мере на Snow Leopard, выводит определенные наборы в stderr вместо stdout, поэтому вам, вероятно, нужно перенаправить stderr в stdout:

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

Это:

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

Значит: запустить команду scselect и grep для *.* Автоматический, который является недопустимым регулярным выражением. Звездочка является модификатором предыдущего атома ("вещи") в выражении, поэтому она не может быть первой вещью.

Если вы хотите сопоставить настоящую звездочку, вы должны избежать обратной косой черты.

Спифф предложил это, но использовал двойные кавычки, которые не передают обратную косую черту, вы должны использовать одинарные кавычки или двойную обратную косую черту. Смущены еще? :)

Так что это дало бы:

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

Что означает, запустите команду scselect, найдите строку, которая соответствует *.* Автоматически и выведите его, затем используйте это в качестве аргументов команды 'test' (также известной как '[').

Команда test не принимает строку вывода из scselect в качестве аргумента.

Что вы действительно хотите сделать, так это вообще не использовать команду test:

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

Но, как упоминал Спифф, по какой-то глупой причине scselect отправляет свой вывод в stderr, а не в stdout.

Итак, теперь вы в конечном итоге:

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

Это прекрасно работает, но все равно отправляет строку, которую grep передает нам в STDOUT, что, вероятно, нам не нужно в нашем выводе, поэтому давайте исправим это:

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

И ... вот, пожалуйста.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .