Сравнение выходной строки команды Bash и использование условия IF ELSE - PullRequest
1 голос
/ 01 июня 2019

Как сравнить выходные данные команды bash и использовать блок IF ELSE, чтобы что-то сделать.

Я пытаюсь записать выходные данные команды bash в переменную CMD, и если переменная пуста / равна нулю, то выводится, что двоичный файл / функция отсутствует. Довольно простой.

В приведенном ниже коде, второй, если еще

# Check if the CPU supports KVM
cmd=$(grep -Eiw 'vmx|svm' /proc/cpuinfo)
if [[ $cmd -ne 0 ]];then 
    echo "CPU on this machine does not support KVM. Check documentation please"
fi



#!/bin/bash

# Check if KVM kernel modules are installed.
cmd=$(lsmod | awk '{print $1}' | grep -Eiw 'kvm\|kvm_intel\|kvm_amd')
if [[ $cmd -ne 0 ]];then 
    echo "KVM kernel modules kvm or kvm_[intel|amd] missing. Use modprobe to load them please"
fi

# Check if the CPU supports KVM
cmd=$(grep -Eiw 'vmx|svm' /proc/cpuinfo)
if [[ $cmd -ne 0 ]];then 
    echo "CPU on this machine does not support KVM. Check documentation please"
fi

Вместо того, чтобы просто проверять условие, скрипт печатает вывод команды (/ proc / cpuinfo), я просто хочу, чтобы он выводил строку эха, но не вывод команды.

Ответы [ 4 ]

1 голос
/ 07 июня 2019

Спасибо за ваши ответы.

Многие из вас предложили использовать код выхода, который, возможно, является ответом, но я определенно проверил, является ли выходной результат, хранящийся в переменной, пустой или непустой строкой, а условие теста [[]] не должно выводиться в STD -Вне просто сделайте сравнение, не выводя ничего на терминал.

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

В-третьих, я не использовал egrep, поскольку он нестандартный и устарел [Ref: http://pubs.opengroup.org/onlinepubs/9699919799/utilities/grep.html]

Наконец, использование -i и -w является избыточным, поскольку модули будут в нижнем регистре, а awk делает то же самое, что и -w [Согласовано], но просто хотел избежать предположений, особенно если они всегда будут строчными.

Мое решение: cmd = $ (grep -Eiw 'vmx | svm' / proc / cpuinfo) [[-z "$ cmd"]] && echo "ошибка:: ЦП не поддерживает KVM. Проверьте документацию." && выход 1

-z не выводит строку возврата на терминал и просто сообщает, является ли строка пустой или непустой.

1 голос
/ 02 июня 2019

Вы должны проверить команду статус выхода , а не ее вывод.

#!/bin/bash

# Check if KVM kernel modules are installed.
if ! lsmod | awk '{print $1}' | grep -q -Eiw 'kvm|kvm_intel|kvm_amd'; then
    echo "KVM kernel modules kvm or kvm_[intel|amd] missing. Use modprobe to load them please"
fi

# Check if the CPU supports KVM
if ! grep -q -Eiw 'vmx|svm' /proc/cpuinfo; then
    echo "CPU on this machine does not support KVM. Check documentation please"
fi

или

#!/bin/bash

# Check if KVM kernel modules are installed.
lsmod | awk '{print $1}' | grep -q -Eiw 'kvm\|kvm_intel\|kvm_amd'
ret=$?
if ((ret != 0)); then
    echo "KVM kernel modules kvm or kvm_[intel|amd] missing. Use modprobe to load them please"
fi

# Check if the CPU supports KVM
grep -q -Eiw 'vmx|svm' /proc/cpuinfo
ret=$?
if ((ret != 0)); then
    echo "CPU on this machine does not support KVM. Check documentation please"
fi

Также решите, используете ли вы grep 'vmx\|svm' или grep -E 'vmx|svm'. Экранирование \| в -E будет анализировать | как буквальный символ. Здесь bashfaq Как сохранить возвращаемое значение и / или вывод команды в переменной? - хорошее введение в bash.

Также grep -Eiw выглядит немного странно. Вы действительно ищете модули с именем KvM_InTeL или kVM_INteL или kVm_InTeL? Имя модуля только одно, оно строчное - kvm, kvm_intel, kvm_amd. Также использование -w не имеет значения - вывод lsmod | awk '{print $1}' уже по одному на строку. Я бы просто пошел с grep 'kvm\|kvm_intel\|kvm_amd'.

1 голос
/ 02 июня 2019

Вы делаете это сложнее, чем нужно. Вам просто нужно использовать составную команду , чтобы (1) проверить, присутствуют ли расширения vmx или svm в /proc/cpuinfo, и (2) проверить, является ли модуль kvm или kvm_intel загружается проверкой /proc/modules. С помощью составной команды достаточно двух вызовов:

#!/bin/bash

grep -wq 'vmx\|svm' /proc/cpuinfo || {   ## check CPU support
    printf "error: CPU does not support vmx or svm extensions.\n" >&2
    exit 1
}

grep -q '^kvm' /proc/modules || {        ## check modules loaded
    printf "error: CPU supports KVM, but kvm modules not loaded.\n" >&2
    exit 1
}

printf "CPU supports KVM and modules present.\n"

Пример использования / Вывод

$ bash ~/scr/utl/kvmsupport.sh
CPU supports KVM and modules present.

Вы можете сделать это любым количеством способов, но, как правило, чем проще это сделать, тем меньше вероятность ошибки.

0 голосов
/ 02 июня 2019

Стандартный способ получить нулевой код выхода в том и только в том случае, если сопоставлен некоторый шаблон: grep --quiet PATTERN (или -q, если у вас нет GNU Grep).Вы можете использовать тот же шаблон в конвейере, если grep является командой last в конвейере или вы используете set -o pipefail, чтобы получить первый ненулевой код выхода в конвейере в качестве кода выходавесь конвейер.

Так что в вашем случае это будет просто:

if lsmod | awk '{print $1}' | grep -Eiw 'kvm\|kvm_intel\|kvm_amd'
then
    …
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...