linux - Bash if 语句,使用来自文件的 grep -eq 0 from $?

标签 linux bash shell

我正在尝试让这个小脚本正常工作,告诉我是否启用了两个选项之一。它似乎适用于第一个 if 语句,但不适用于接下来的两个。谁能指出我正确的方向来完成这项工作?

编辑:这个脚本的目的是我可以运行的东西,检查 tun0 (或 tun 的任何变体存在于 ifconfig 输出中)是否存在,如果存在,我就完成了,如果不存在,我需要检查其他两行之一是否在“test.ini”文件中被标记为"is",看看 tun0 丢失是否有什么值得关注的,或者我是否可以跳过它。 7 号线和 12 号线是这个区域让我感到困惑的地方。很抱歉我没有提前澄清这一点。

 1 #!/bin/bash
 2
 3 if [[ $(ifconfig|grep -iq tun;echo $?) -eq 0 ]]
 4 then
 5         echo "This unit has tun0"
 6 else
 7         if [[ $(grep -iq enabled=yes test.ini|grep -v "Auto\|Purge\|AD"|awk '{print $1}';echo $?) -eq 1 ]]
 8         then
 9                 echo "This unit has file copy enabled"
 10                 echo "but does not have tun0"
 11         else
 12                 if [[ $(grep -iq AutoSyncEnabled=yes test.ini|grep -v Exchange|awk '{print $1}';echo $?) -eq 1 ]]
 13                 then
 14                         echo "This unit has rsync enabled"
 15                         echo "but does not have tun0"
 16                 else
 17                         echo "No tun0 but no requirement either."
 18                 fi
 19         fi
 20 fi

最佳答案

您期望 Awk 在没有匹配项时将其退出代码设置为 1,但 Awk 默认情况下不会这样做。你需要做类似的事情

awk '{ success ... exit 0 } END { exit 1 }'

显式设置退出代码。

if [[ $(something; echo $?) -eq 0 ]]也是一大堆反模式。你只是想要

if something

--检查$?是什么if做;这就是它的目的。

根据您下面的评论,您显然是指 if grep -i something test.ini | something else没有 -q (它会抑制 grep 的任何输出),可以重构为

if awk '/something/ && ... something else' test.ini

除了丢失-i来自grep的标志。明显的解决方法是小写输入行(同样小写正则表达式,因为否则你当然不会获得匹配!),但还有其他方法可以使 Awk 进行比较,同时忽略字符大小写。

if awk 'tolower($0) ~ /something/ && ... something else' test.ini

有了这些评论,尝试一下这个重构版本。

#!/bin/bash

if ifconfig | grep -iq tun; then
     echo "This unit has tun0"
elif ! awk 'tolower($0) ~ /enabled=yes/ && !/Auto|Purge|AD/{
        print $1; fail=1} END { exit fail }' test.ini
then
    echo "This unit has file copy enabled"
    echo "but does not have tun0"
elif ! awk 'tolower($0) ~ /autosyncenabled=yes/ && !/Exchange/{
        print $1; fail=1} END { exit fail }' test.ini
then
    echo "This unit has rsync enabled"
    echo "but does not have tun0"
else
    echo "No tun0 but no requirement either."
fi

您的 Awk 脚本会将输出打印到标准输出;如果不需要,请取出 print只是exit 0第一次成功,否则 END { exit 1 }' ,像这样;

:
elif awk 'tolower($0) ~ /enabled=yes/ && !/Auto|Purge|AD/{ exit 0 }
        END { exit 1 }' test.ini
then
:

另请注意elif避免嵌套 if流得太深了。

关于linux - Bash if 语句,使用来自文件的 grep -eq 0 from $?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33629062/

相关文章:

bash - gpg 仅加密文件夹中的某些文件

linux - 它在构建AWK中不起作用吗?

python - 在python中每次迭代时分别获取函数的日志

windows - 在 Windows 10 的 Ubuntu Bash shell 中,如何使用默认程序打开文件或目录?

php - yum安装后如何启动php?

linux - 无法更改 tclsh 路径

android - 在 adb shell 中存在的 sh 的帮助下在 android 设备中运行的脚本文件

django - 将 celery worker 作为守护进程启动

linux - 通过 bash 脚本执行编译器标志

python - 找出每个 clientId 的新旧映射之间的差异