我想让这个小脚本工作,告诉我是否启用了两个选项之一。它似乎适用于第一个if语句,但不适用于接下来的两个语句。任何人都可以指出我正确的方向来做这项工作吗?
编辑:我可以运行这个脚本的目的,检查是否存在tun0(或ifconfig输出中存在的tun的任何变体),如果存在,我已经完成,如果没有,我需要检查其他两行中的一行是否在“test.ini”文件中被标记为是,以查看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
答案 0 :(得分:2)
当没有匹配项时,您希望Awk将其退出代码设置为1,但Awk默认情况下不会这样做。你需要做一些像
这样的事情Settings/Editor/Code Style/HTML/Other
显式设置退出代码。
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
标志外。显而易见的解决方法是小写输入行(并且同样小写正则表达式,因为否则你当然不会得到匹配!)但是还有其他方法可以让Awk进行比较而忽略字符大小写。
grep
通过这些评论,请尝试这个重构版本。
if awk 'tolower($0) ~ /something/ && ... something else' test.ini
您的Awk脚本会将输出打印到标准输出;如果不需要,请在第一次成功时取出#!/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
并print
,否则exit 0
,就像这样;
END { exit 1 }'
另请注意:
elif awk 'tolower($0) ~ /enabled=yes/ && !/Auto|Purge|AD/{ exit 0 }
END { exit 1 }' test.ini
then
:
以避免将elif
流嵌套得太深。
答案 1 :(得分:0)
我最终找到了两种让它发挥作用的方法。我采取的路线,使用我们的一个内部程序来读取文件,只给出是/否的输出。从那以后,我使用
完成了if语句== [Yy]es ]]
我还发现,我可以用太多的管子继续沿着兔子洞走下去,以获得我想要的输出。
if [[ $(grep -i enabled=yes test.ini|grep -v "Auto\|Purge\|AD"|awk '{print $1}'|cut -b 9-11) == [Yy]es ]]
然而,使用内部程序,定期读取该文件,并使其吐出yes或no的输出,似乎更简单(并且没有管道/长抽出语句等)。
我最大的问题是,正如Jens指出的那样,管道太多了。另外,正如123指出的那样,我没有意识到$?就是在最后一个管道上完成的,而不是整个命令。
谢谢大家对此的帮助。每个人的评论中的大量信息都将极大地帮助我们编写未来的脚本,以及如何编写它们。