我正在尝试执行以下循环,但我失败了。我读过双括号和其他东西,但是,我无法让它工作(尤其是第二部分与grep
)。我可以让每个部分单独工作,但不能同时工作。
第一次尝试:
a=1;
b=1;
while { ( n1=$(grep 'too many requests' *.htm* )) && (( $a -eq $b )) }; do
echo "aa"
done
第二次尝试:
while [[ n=$(grep 'too many requests' *.htm* ) && $a==$b ]]; do
echo "error"
done
第三次尝试
while [[ n=$(grep 'too many requests' *.htm* ) && "$a" -eq "$b" ]]; do
echo "aa"
done
我期望的是:如果 HTML 文件不包含短语“太多请求”,并且a
等于b
,则进入循环。
这使用的否定退出状态和
grep
比较字符串相等性的结果(使用's进行相等性的整数评估)。如果两者都为真(在任何匹配的文件中都找不到该字符串,并且两个变量相同),则执行,将字符串输出到标准错误流。$a
$b
[
-eq
*.htm*
echo
error
请注意使用 single
=
并在其周围添加空格。(=
or ) 运算符是( ) 实用程序-eq
的一个参数,并不本质上与关键字相关联。[
test
if
实用程序的选项
-q
和-F
使grep
实用程序安静并在找到匹配项后立即退出 (-q
) 并将给定模式视为文本字符串而不是正则表达式 (-F
)。你的例子使用了一个
while
循环,它应该是一个if
语句。如果要单独处理每个文件,请使用for
循环:grep
如果您只想测试某个模式是否在一个文件或一组文件中匹配,则不必保存输出。您可以改为使用grep -q
实用程序的退出状态并对其做出反应,如上所示。在您的第一个代码片段中,您使用算术评估
(( $a -eq $b ))
. 这可以更好地写成(( a == b ))
,它计算出一个if
语句可以用作布尔值的结果。该-eq
运算符特定于[
实用程序,在(( ... ))
.在第二个代码片段中,您使用
$a==$b
. 这将评估为一个字符串,1==1
shell 将尝试将其用作命令。在第三个代码片段中,您使用
"$a" -eq "$b"
within ,它正确地执行了和[[ ... ]]
之间的整数相等性测试。由于命令和您不否定其退出状态的方式(以及您使用循环而不是语句的事实) ,这不会按预期工作。$a
$b
grep
while
if
在
[ ... ]
中,=
测试字符串相等性和-eq
测试整数相等性。从技术上讲,==
它不是用于[ ... ]
测试的有效运算符,但bash
支持它。shell 在使用 时在其特殊语法bash
内进行 shell 模式匹配,如[[ ... ]]
==