[英]Problem with comparison for checking that a string contains only digits in a bash shell script
[英]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可以發送到STDOUT而FAILURE到STDERR 。
因此,根據您測試的方向,您的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.