
Я работаю над заданием, которое требует от меня принимать пользовательский ввод для поиска текущих пользователей на сервере, и если пользовательский ввод находится в сети, мне нужно вывести имя пользователя. Если пользователь не вошел в систему, мне нужно отреагировать соответствующим образом. Я работаю над этим кодом уже несколько дней и, похоже, не могу в нем разобраться. Я могу искать пользователя, но когда дело доходит до сравнения моей переменной пользовательского ввода со строкой переменной, содержащей имя пользователя, который вошел в систему, я постоянно получаю ошибку, в которой говорится, что слишком много аргументов. Пожалуйста, посмотрите мой код ниже:
#!/bin/bash
read -p "Please enter the user name you would like to search: " userName
name=$(who | grep "${userName}" | awk '{print $1}');
if [ [ $name == *"$userName"* ] ];
then
echo $name
else
printf "That user is not logged in.\n";
fi
решение1
Вы близки, но главная проблема в том, что [[ ]]
конструкция bash не может иметь пробелов между скобками. Она думает, что вы пытаетесь выполнить несколько [
команд, что является командой POSIX test
. Если вы исправите это, то это сработает, но если у пользователя открыто несколько tty, то он выведет его имя один раз для каждого. Если вы хотите использовать grep
, вы можете сделать это:
#!/bin/bash
read -p "Please enter the user name you would like to search: " userName
if who | awk '{print $1}' | grep -wq "$userName"
then
echo "$userName is logged in."
else
echo "That user is not logged in.";
fi
exit