所以我需要一个带有两个条件的if语句:
if [[ $(cat /etc/hosts.deny 2>/dev/null) != *"ALL"* ]]; then
if [[ $(cat /etc/hosts.allow 2>/dev/null) != *"123.123.123.123"* ]]; then
如果两个条件都正确,它应该回显/etc/hosts.allow中的IP。 我尝试将两个字符串设置为1行&&之间但由于某种原因不起作用。有人能够指出我做错了什么吗?
答案 0 :(得分:1)
请勿使用cat
;只需使用grep
:
if grep -qvF 'ALL' /etc/hosts.deny && grep -qvF '123.123.123.123' /etc/hosts.allow; then
-q
抑制输出;你不关心哪些行包含匹配的模式,只有grep
的退出状态为0或非零。-v
反转退出状态;如果模式不匹配,则grep
成功。-F
将参数视为固定字符串,而不是正则表达式。这样可以避免转义.
以匹配文字句点,并且效率更高。&&
仅当两个 grep
命令的退出状态为0
时才会创建一个存在状态为0的列表,并且仅运行第二个如果第一个grep
成功,则grep
。答案 1 :(得分:0)
正如您所做的那样,使用double [
将表达式插入到&&
或||
内作为逻辑运算符
if [[ $(cat /etc/hosts.deny 2>/dev/null) != *"ALL"* && $(cat /etc/hosts.allow 2>/dev/null) != *"123.123.123.123"* ]] ; then ...
使用bash 4.2,但不是所有shell。
修改:请注意[
,if
,&&