簡體   English   中英

檢查命令的output是否包含shell腳本中的某個字符串

[英]Checking if output of a command contains a certain string in a shell script

我正在編寫一個 shell 腳本,我正在嘗試檢查命令的 output 是否包含某個字符串。 我想我可能必須使用 grep,但我不確定如何使用。 有人知道嗎?

測試$? 一種反模式。

if ./somecommand | grep -q 'string'; then
  echo "matched"
fi

測試grep的返回值:

./somecommand | grep 'string' &> /dev/null
if [ $? == 0 ]; then
   echo "matched"
fi

這是慣用的方式:

if ./somecommand | grep -q 'string'; then
   echo "matched"
fi

並且:

./somecommand | grep -q 'string' && echo 'matched'

另一種選擇是檢查命令輸出上的正則表達式匹配。

例如:

[[ "$(./somecommand)" =~ "sub string" ]] && echo "Output includes 'sub string'"

一個干凈的 if/else 條件 shell 腳本:

if ./somecommand | grep -q 'some_string'; then
  echo "exists"
else
  echo "doesn't exist"
fi

這看起來更明顯,不是嗎?

# Just a comment... Check if output of command is hahaha
MY_COMMAND_OUTPUT="$(echo hahaha)"
if [[ "$MY_COMMAND_OUTPUT" != "hahaha" ]]; then
  echo "The command output is not hahaha"
  exit 2
else
  echo "The command output is hahaha"
fi

簡答

以上所有(非常好)的答案都假設grep可以“看到”命令的輸出,這並不總是正確的:

SUCCESS可以發送到STDOUTFAILURESTDERR

因此,根據您測試的方向,您的grep可能會失敗。 也就是說,如果您正在測試FAILURE的情況,則必須在這種情況下使用2>&1將命令的輸出重定向到 STDOUT。

有證據的更長答案

我在使用grep的 bash 腳本中進行了我認為非常簡單的測試,但它一直失敗。 隨之而來的是許多頭撓頭。 在我的腳本中使用set -x顯示變量為空! 所以我創建了以下測試來了解事情是如何發生的。

注意iscsiadm是來自“ open-iscsi ”包的 Linux 工具,用於將主機連接/斷開連接到 SAN 存儲。 命令iscsiadm -m session用於顯示是否建立了任何 LUN 連接):

#!/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

如果連接,這兩個變量被成功填入值:

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)

然而,如果一個LUN連接, iscsiadm發送輸出到STDERR,並被填充只有“TEST2”變量,其中我們已經使用重定向到STDOUT 2>&1 ; 沒有重定向到 STDOUT 的“ TEST1 ”變量為空:

iscsiadm: No active sessions.

Print TEST1


Print TEST2
iscsiadm: No active sessions.

結論

如果你有一個時髦的、半壞的——在一個方向上工作而不是另一個方向——像這樣的情況,嘗試用你自己的命令替換iscsiadm上面的測試,你應該獲得適當的可見性來重寫你的測試以使其正常工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM