我正在编写一个shell脚本,我正在尝试检查命令的输出是否包含某个字符串.我想我可能不得不使用grep,但我不确定如何.有人知道吗?
mat*_*mat 140
测试$?是一种反模式
if ./somecommand | grep -q 'string'; then
echo "matched"
fi
Run Code Online (Sandbox Code Playgroud)
per*_*eal 73
测试grep的返回值:
./somecommand | grep 'string' &> /dev/null
if [ $? == 0 ]; then
echo "matched"
fi
Run Code Online (Sandbox Code Playgroud)
这是惯用的做法:
if ./somecommand | grep -q 'string'; then
echo "matched"
fi
Run Code Online (Sandbox Code Playgroud)
并且:
./somecommand | grep -q 'string' && echo 'matched'
Run Code Online (Sandbox Code Playgroud)
Noa*_*nos 11
另一种选择是检查命令输出上的正则表达式匹配。
例如:
[[ "$(./somecommand)" =~ "sub string" ]] && echo "Output includes 'sub string'"
Run Code Online (Sandbox Code Playgroud)
F1L*_*nux 10
上述所有(非常出色)的答案都假设grep可以“看到”命令的输出,但这并不总是正确的:
SUCCESS可以发送到STDOUT,而FAILURE可以发送到STDERR。
因此,根据您测试的方向,您grep可能会失败。也就是说,如果您正在测试FAILURE的情况,则必须将命令的输出重定向到 STDOUT,2>&1在这种情况下使用。
我在 bash 脚本中进行了一个我认为非常简单的测试,grep但它一直失败。接下来是很多令人头疼的事情。在我的脚本中使用set -x显示该变量为空!因此,我创建了以下测试来了解事情是如何发生的。
注意:是“ open-iscsiiscsiadm ”软件包中的一个 Linux 工具,用于连接/断开主机与 SAN 存储的连接。该命令用于显示是否建立了任何 LUN 连接):iscsiadm -m session
#!/bin/bash
set -x
TEST1=$(iscsiadm -m session)
TEST2=$(iscsiadm -m session 2>&1)
echo
echo 'Print TEST1'
echo $TEST1
echo
echo 'Print TEST2'
echo $TEST2
echo
Run Code Online (Sandbox Code Playgroud)
如果已连接LUN ,则两个变量均已成功填充值:
Print TEST1
tcp: [25] 192.168.X.XX:3260,1 iqn.2000-01.com.synology:ipdisk.Target-LUN1 (non-flash) tcp: [26] 192.168.X.XX:3260,1 iqn.2000-01.com.synology:storagehost.Target-LUN1 (non-flash)
Print TEST2
tcp: [25] 192.168.X.XX:3260,1 iqn.2000-01.com.synology:ipdisk.Target-LUN1 (non-flash) tcp: [26] 192.168.X.XX:3260,1 iqn.2000-01.com.synology:storagehost.Target-LUN1 (non-flash)
Run Code Online (Sandbox Code Playgroud)
但是,如果 LUN未连接,iscsiadm则将输出发送到 STDERR,并且仅填充“ TEST22>&1 ”变量,我们使用 ; 重定向到 STDOUT 。没有重定向到 STDOUT 的“ TEST1 ”变量为空:
iscsiadm: No active sessions.
Print TEST1
Print TEST2
iscsiadm: No active sessions.
Run Code Online (Sandbox Code Playgroud)
如果您有一个时髦的、半损坏的-在一个方向上工作但在另一个方向上不起作用-诸如此类的情况,请尝试用iscsiadm您自己的命令替换上述测试,您应该获得适当的可见性来重写您的测试以使其正常工作。
一个干净的 if/else 条件 shell 脚本:
if ./somecommand | grep -q 'some_string'; then
echo "exists"
else
echo "doesn't exist"
fi
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
124379 次 |
| 最近记录: |