[英]How to compare strings in Bash
如何將變量與字符串進行比較(如果它們匹配則執行某些操作)?
if [ "$x" = "valid" ]; then
echo "x has the value 'valid'"
fi
如果您想在它們不匹配時執行某些操作,請將=
替換=
!=
。 您可以在各自的文檔中閱讀有關字符串運算和算術運算的更多信息。
$x
周圍使用引號? 您需要$x
周圍的引號,因為如果它為空,您的 Bash 腳本會遇到如下所示的語法錯誤:
if [ = "valid" ]; then
==
運算符的非標准使用請注意,Bash 允許==
用於與[
相等,但這不是標准的。
使用第一種情況,其中$x
周圍的引號是可選的:
if [[ "$x" == "valid" ]]; then
或使用第二種情況:
if [ "$x" = "valid" ]; then
或者,如果您不需要else子句:
[ "$x" == "valid" ] && echo "x has the value 'valid'"
a="abc"
b="def"
# Equality Comparison
if [ "$a" == "$b" ]; then
echo "Strings match"
else
echo "Strings don't match"
fi
# Lexicographic (greater than, less than) comparison.
if [ "$a" \< "$b" ]; then
echo "$a is lexicographically smaller then $b"
elif [ "$a" \> "$b" ]; then
echo "$b is lexicographically smaller than $a"
else
echo "Strings are equal"
fi
筆記:
if
和[
和]
之間的空格很重要>
和<
是重定向運算符,因此對於字符串,分別使用\\>
和\\<
將其轉義。要將字符串與通配符進行比較,請使用:
if [[ "$stringA" == *$stringB* ]]; then
# Do something here
else
# Do something here
fi
我不得不在一點上不同意其中一條評論:
[ "$x" == "valid" ] && echo "valid" || echo "invalid"
它只是看起來像一個,嗯,外行......
在某種程度上,它使用通用模式作為一種語言;
在你學會了語言之后。
它是一個簡單的邏輯表達式,有一個特殊的部分:邏輯運算符的惰性求值。
[ "$x" == "valid" ] && echo "valid" || echo "invalid"
每個部分都是一個邏輯表達式; 第一個可能是真的或假的,其他兩個總是真的。
(
[ "$x" == "valid" ]
&&
echo "valid"
)
||
echo "invalid"
現在,當它被評估時,第一個被檢查。 如果為假,則邏輯的第二個操作數和它之后的&&
不相關。 第一個不是真的,所以無論如何它不可能是第一個,第二個是真的。
現在,在這種情況下是邏輯的第一面或||
錯誤,但如果另一方(第三部分)為真,則可能為真。
因此將評估第三部分 - 主要是將消息作為副作用編寫。 (它的結果為0
為真,我們在這里不使用)
其他情況類似,但更簡單 - 而且 - 我保證! 是 - 可以 - 易於閱讀!
(我沒有,但我認為作為一名留着灰胡子的 UNIX 老手對此有很大幫助。)
以下腳本逐行讀取名為“testonthis”的文件,然后將每一行與一個簡單字符串、一個包含特殊字符的字符串和一個正則表達式進行比較。 如果不匹配,則腳本將打印該行,否則不打印。
Bash 中的空間非常重要。 所以以下將起作用:
[ "$LINE" != "table_name" ]
但以下不會:
["$LINE" != "table_name"]
所以請按原樣使用:
cat testonthis | while read LINE
do
if [ "$LINE" != "table_name" ] && [ "$LINE" != "--------------------------------" ] && [[ "$LINE" =~ [^[:space:]] ]] && [[ "$LINE" != SQL* ]]; then
echo $LINE
fi
done
您還可以使用用例/ esac :
case "$string" in
"$pattern" ) echo "found";;
esac
如果輸入只有幾個有效條目,我可能會使用正則表達式匹配。 例如,只有“開始”和“停止”是有效的動作。
if [[ "${ACTION,,}" =~ ^(start|stop)$ ]]; then
echo "valid action"
fi
請注意,我使用雙逗號將變量$ACTION
小寫。 另請注意,這不適用於過時的 bash 版本。
Bash 4+ 示例。 注意:當單詞包含空格等時,不使用引號會導致問題。在 IMO 中始終引用 Bash。
以下是 Bash 4+ 中的一些示例:
示例 1,檢查字符串中的 'yes'(不區分大小寫):
if [[ "${str,,}" == *"yes"* ]] ;then
示例 2,檢查字符串中的 'yes'(不區分大小寫):
if [[ "$(echo "$str" | tr '[:upper:]' '[:lower:]')" == *"yes"* ]] ;then
示例 3,檢查字符串中的 'yes'(區分大小寫):
if [[ "${str}" == *"yes"* ]] ;then
示例 4,檢查字符串中的 'yes'(區分大小寫):
if [[ "${str}" =~ "yes" ]] ;then
示例 5,完全匹配(區分大小寫):
if [[ "${str}" == "yes" ]] ;then
示例 6,完全匹配(不區分大小寫):
if [[ "${str,,}" == "yes" ]] ;then
例7,完全匹配:
if [ "$a" = "$b" ] ;then
享受。
我是這樣做的,與 Bash 和Dash (sh) 兼容:
testOutput="my test"
pattern="my"
case $testOutput in (*"$pattern"*)
echo "if there is a match"
exit 1
;;
(*)
! echo there is no coincidence!
;;esac
if [ $VAR= "TEST" ]; then
echo "variable VAR matches with string TEST"
else
echo "VAR does not match with the string TEST"
fi
你有比較問題嗎? (如下圖?)
var="true"
if [[ $var == "true" ]]; then
# It should be working, but it is not...
else
# It is falling here...
fi
嘗試使用=~運算符(正則表達式運算符),它可能會起作用:
var="true"
if [[ $var =~ "true" ]];then
# Now it works here!!
else
# No more inequality
fi
我在同樣的情況下苦苦掙扎了一段時間,這是我可以解決的方法:
if [ "$var1" == "$var2" ]; then
#dowhateveryouwant
fi
注意比較符號前后的空格,否則它不會起作用或者會給你意想不到的結果。
我花了很多時間在使用一個等號 (=) 上,但沒有用。 我希望它能有所幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.