awk
para o resgate.
$ scselect | awk '{if ($1=="*") print $3}'
(Automatic)
Se quiser, você também pode usar sed
para remover os parênteses.
$ scselect | awk '{if ($1=="*") print $3}' | sed 's/[()]//g'
Automatic
Eu preciso usar o local de rede atual dentro de um script bash condicional. Eu tentei usar o comando scselect
, que gera um asterisco ao lado do local atual:
~/ scselect
Defined sets include: (* == current set)
70209F72-5BE9-44D1-979E-A8BA25A317B4 (Office)
* BDF51A74-6547-4747-BD21-30C51DA26CB1 (Automatic)
Isso não funciona:
#!/bin/bash
if [ 'scselect | grep "*.*Automatic"' ]; then
...
fi
devido ao *
na saída de scselect
que se expande na lista de nomes de arquivos no diretório atual.
Você pode simplesmente escapar do *
com um \
. Além disso, parece que scselect
, pelo menos no Snow Leopard, envia os conjuntos definidos para stderr em vez de stdout, então você provavelmente precisará redirecionar stderr para stdout:
scselect 2>&1 | grep "\*.*Automatic"
Isto:
if [ 'scselect | grep "*.*Automatic"' ]; then
Significa: execute o comando scselect e grep para *. * Automatic, que é uma expressão regular inválida. O asterisco é um modificador do átomo anterior ("coisa") na expressão, por isso não pode ser a primeira coisa.
Se você quiser corresponder a um asterisco real, terá que escapar com uma barra invertida.
Spiff sugeriu isso, mas usou aspas duplas que não passam a barra invertida, você tem que usar aspas simples ou uma barra invertida dupla. Confuso ainda? :)
Então, isso daria:
if [ 'scselect | grep '\*.*Automatic'' ]; then
O que significa, execute o comando scselect, localize a linha que corresponde a *. * Automatic e execute-a, então use-a como os argumentos para o comando 'test' (também conhecido como '[').
O comando de teste não usa uma linha de saída do scselect como argumento.
O que você realmente quer fazer é não usar o comando test:
if scselect | grep '\*.*Automatic'; then
Mas como Spiff mencionou, por algum motivo bobo, o scselect envia sua saída para stderr não stdout.
Então agora você acaba com:
if scselect 2>&1 | grep '\*.*Automatic'; then
O que funciona muito bem, mas ainda envia aquela linha que o grep está nos dando para STDOUT, o que provavelmente não queremos em nossa saída, então vamos corrigir isso:
if scselect 2>&1 | grep '\*.*Automatic' >/dev/null 2>&1; then
E ... lá vai você.