我如何比较bash命令的输出并使用IF ELSE块做某事。
我正在尝试捕获CMD变量中的bash命令输出,如果该变量为空/零,则输出二进制/功能缺失。很基本。
在下面的代码中,第二个,否则
# 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),我只希望它打印回显行,而不是命令输出。
答案 0 :(得分:1)
您应该检查命令退出状态,而不是输出。
#!/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 How can I store the return value and/or output of a command in a variable?是一个不错的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 :(得分:1)
您正在使这一过程变得更加困难。您只需使用 compound命令即可(1)检查vmx
中是否存在svm
或/proc/cpuinfo
扩展名,以及(2)检查{通过检查kvm
来加载{1}}或kvm_intel
模块。使用 compound命令只需两个调用:
/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"
您可以通过多种方法来执行此操作,但是通常,您可以更简单地进行保存,出错的机会也就更少。
答案 2 :(得分:1)
谢谢您的回答。
许多人建议使用退出代码,这也许是答案,但是我具体检查了存储在变量中的输出结果是空字符串还是非空字符串,并且[[]]测试条件不应输出到STD -OUT,只做一个比较而不向终端输出任何东西。
第二,我不想使用-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“错误::CPU不支持KVM。请检查文档。” &&出口1
-z不会将返回字符串输出到终端,而只是告诉该字符串是空还是非空。
答案 3 :(得分:0)
当且仅当某些模式匹配时,获取零退出代码的标准方法是grep --quiet PATTERN
(如果没有GNU Grep,则为-q
)。如果grep
是管道中的 last 命令,或者您可以使用set -o pipefail
获取管道中的第一个非零退出代码,则可以在管道中使用相同的模式整个管道的退出代码。
因此,在您的情况下,它就是:
if lsmod | awk '{print $1}' | grep -Eiw 'kvm\|kvm_intel\|kvm_amd'
then
…