作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我在看 an answer in another thread关于 bash 脚本中 if
使用哪个括号对。 [[
不那么令人惊讶,并且具有更多功能,例如模式匹配 (=~
) 而 [
和 test
是内置且符合 POSIX 标准,使其具有便携性。
最近,我试图测试 grep
命令的结果,但由于 [: too many arguments
而失败。我正在使用 [
。但是,当我切换到 [[
时,它起作用了。我将如何使用 [
进行这样的测试以保持可移植性?
这是失败的测试:
#!/bin/bash
cat > slew_pattern << EOF
g -x"$
EOF
if [ $(grep -E -f slew_pattern /etc/sysconfig/ntpd) ]; then
echo "slew mode"
else
echo "not slew mode"
fi
以及成功的测试:
#!/bin/bash
cat > slew_pattern << EOF
g -x"$
EOF
if [[ $(grep -E -f slew_pattern /etc/sysconfig/ntpd) ]]; then
echo "slew mode"
else
echo "not slew mode"
fi
最佳答案
if [ $(grep -E -f slew_pattern /etc/sysconfig/ntpd) ]; then
对于多个匹配项,此命令肯定会失败。它会抛出错误,因为 grep
输出在行尾被拆分。
grep
的多个匹配用换行符分隔,测试命令变为:
[ match1 match2 match3 ... ]
这没有多大意义。根据 grep
返回的匹配项数量(即测试命令 [
] 的参数数量),您将收到不同的错误消息。
例如:
2 场比赛会给你 unary operator expected
错误
3 场比赛会给你 binary operator expected
错误和
在 Bash 中,超过 3 个匹配会给你 too many arguments
错误或类似的错误。
您需要在 [
中引用变量以防止分词。
另一方面,Bash 特定的 [[
默认情况下会阻止分词。因此,grep
输出不会在新行上拆分,而是保持为单个字符串,这是测试命令的有效参数。
所以解决办法就是只看grep
的退出状态:
if grep -E -f slew_pattern /etc/sysconfig/ntpd; then
或者在捕获输出时使用引号:
if [ "$(grep -E -f slew_pattern /etc/sysconfig/ntpd)" ]; then
注意:
-q
选项抑制 grep
命令的输出,使用 -s
选项抑制错误。关于linux - 如何在单括号中使用 grep?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31040817/
我是一名优秀的程序员,十分优秀!