Как пробудить все строки вместо того, чтобы смотреть только на первый - PullRequest
0 голосов
/ 11 марта 2020

Я пытаюсь написать скрипт, который позволит вам ввести имя вашего компьютера, а затем сообщить, находится ли хост в локальной сети. Вот что у меня есть:

#!/bin/bash
echo "Please enter the host you would like to ping:"
read -r host

output=$(ruptime | awk '{print $1}')

if [ "$output" == "$host" ];
    then
        echo "$host is up"
    else
        echo "$host is down"
fi

Это работает, когда я ввожу имя моей машины 'ubuntu', так как я единственный в моей локальной сети, и оператор awk выводит 'ubuntu'.

Если Например, я запускаю:

#!/bin/bash
    echo "Please enter the host you would like to ping:"
    read -r host

    output=$(cat /etc/hosts | awk '{print $1}')

    if [ "$output" == "$host" ];
        then
            echo "$host is up"
        else
            echo "$host is down"
    fi

Выходные данные состоят из 2 строк: localhost и ubuntu. Если я затем запускаю скрипт и ввожу любой из них, он говорит, что он не найден.

Я думаю, что awk ищет только значение в первой строке. Как сделать так, чтобы скрипт проверял каждую строку из выходных данных awk, а затем сравнивал их с тем, что было введено? Заранее спасибо!

Ответы [ 2 ]

1 голос
/ 11 марта 2020

Предполагая, что ваша цель состоит в том, чтобы посмотреть, находится ли данное имя в первом столбце выходных данных ruptime, это может выглядеть следующим образом:

#!/usr/bin/env bash

hostname="target"
while read -r hostname _; do
  [[ $hostname = "$target" ]] && { echo "$target is up"; break; }
done < <(ruptime)

read -r hostname _ помещает только первый столбец каждой строки в hostname, оставшийся текст в _.

1 голос
/ 11 марта 2020

Вы устанавливаете $output для всех имен. Вы не проверяете, является ли $host одним из них, вы проверяете, равен ли $host всем им одновременно.

grep - лучший способ сделать это.

if ruptime | grep -q -w "$host"
then echo "$host is up"
else echo "$host is down"
fi
...