2012-03-02 1 views
1

привет. Я пытаюсь написать сценарий bourne-shell, который принимает имя в качестве параметра и проверяет, зарегистрирован ли пользователь и выводит сообщение, если нет., которые возвращают значение в bourne-shell

Это то, что я получил до сих пор, но мое состояние ошибочно.

if test "who|grep $1" == "$1" //the problem is that it takes the hole 1st column 
then 
    who|grep $1|awk '{print $5}' 
else 
    echo user not logged in 
fi 

любая помощь? заранее спасибо.

+0

Я считаю 4 ошибки. –

+0

@ IgnacioVazquez-Abrams: Включает ли это состояние гонки? – Johnsyweb

ответ

2

1) Ваше состояние полностью загрязнено.

2) Ваше регулярное выражение неточно.

3) Вы смешиваете grep и awk.

4) Вы не цитируете свой аргумент echo.

if who | grep -q "^$1\s" 
then 
    who | awk -v user="$1" '$1 == user { print $5 }' 
else 
    echo "user not logged in" 
fi 

Замена первого grep с awk остается в качестве упражнения для читателя.

+0

+1: Чтобы указать, что вам не нужно смешивать 'grep' и' awk' [упражнение замены уже сделано;)] и для того, чтобы поместить 'user' в переменную, я отредактировал свой ответ, чтобы включить это. – Johnsyweb

+0

Я пробовал ваш код, но он всегда печатает 'пользователь не вошел в систему', если его не слишком много спрашивают, можете ли вы объяснить свое состояние, пожалуйста? – Glove

3

Несколько примечаний здесь.

1) Используйте [вместо теста - тест - это просто псевдоним для него. ([не является синтаксисом, это имя программы.)

2) // не является комментарием в оболочке. :) Точно так же вещи в «" s, такие как «who | grep ...» не будут выполнены, они будут обрабатываться оболочкой как литералы.

3) начать с делать кто | grep ... | awk, чтобы извлечь конкретный столбец.

4) Вы можете захватывать вывод 3), делая что-то вроде

ПЕРЕМЕННОЙ = $ (кто | ...)

5), то вы можете сделать, если [-z «$ VARIABLE " ] или что-то.

6) Кроме того, проверьте, кто | fgrep -w ... | wc -l дает больше нуля.

Есть, вероятно, еще десяток способов размахивать этим.

+0

Что вы подразумеваете под 6)? извините, я только что начал b-shell – Glove

+0

, если в столбце есть 3 строки, как бы захватить только третью строку первого столбца? \ – Glove

+0

by 6) Я имею в виду, используйте wc -l для подсчета строк вывода из вашего grep. прочитайте страницу man wc для деталей. Я не понимаю ваш второй вопрос в контексте просмотра, если пользователь вошел в систему. – Perry

4

Если вы действительно хотите использовать who и awk:

who | awk -v user="$1" ' 
$1 == user { 
    found = 1 
    print $5 
} 

END { 
    if (!found) { 
     print "user not logged in" 
    } 
}' 

Лично я бы просто использовать finger.

+0

это борн-оболочка? – Glove

+0

Это (в основном) 'awk'. Он должен работать в большинстве снарядов. – Johnsyweb