[英]Comparison of 2 string variables in shell script
考慮有一個變量行和變量字:
line = 1234 abc xyz 5678
word = 1234
從2個不同的文件中讀取這些變量的值。
如果包含單詞,我想打印該行。 我如何使用shell腳本執行此操作? 我嘗試了之前問題中給出的所有建議的解決方案。 例如,即使單詞不在行中,也始終傳遞以下代碼。
if [ "$line"==*"$word"*]; then
echo $line
fi
不需要if
語句; 只需使用grep
:
echo $line | grep "\b$word\b"
您可以使用if [[ "$line" == *"$word"* ]]
您還需要使用以下內容來分配變量
line="1234 abc xyz 5678"
word="1234"
工作示例 - http://ideone.com/drLidd
將變量設置為值時,請勿在等號周圍放置空格。 當值與其間隔時也使用引號:
line="1234 abc xyz 5678" # Must have quotation marks
word=1234 # Quotation marks are optional
使用比較時, 必須在括號和比較符號周圍留下空格:
if [[ $line == *$word* ]]; then
echo $line
fi
注意雙方括號。 如果要進行模式匹配,則必須使用雙方括號而不是單個方括號。 雙方括號表示您在使用==
或=
時正在進行模式匹配操作。 如果使用單個方括號:
if [ "$line" = *"$word"* ]
你在平等。 請注意,雙方括號不需要引號,而大多數情況下需要單括號。
echo $line | grep "$word"
這將是在腳本中執行此操作的典型方法,當然它確實需要花費一個新流程
你可以使用bash match operator =~
:
[[ "$line" =~ "$word" ]] && echo "$line"
不要忘記引號,如前面的答案中所述(尤其是@Bill之一)。
if [ "$line"==*"$word"* ]
不能按預期工作的原因可能有點模糊。 假設不存在導致glob擴展的文件,那么您只是測試字符串1234 abc xyz 5678==*1234*
是非空的。 顯然,這不是一個空字符串,所以條件總是正確的。 你需要在你的==
運算符周圍放置空格,但這不起作用,因為你現在正在測試字符串1234 abc xyz 5678
是否與glob *1234*
展開的字符串相同,所以只有當名為1234 abc xyz 5678
的文件1234 abc xyz 5678
存在於執行shell腳本的進程的當前工作目錄中。 有一些shell擴展允許這種比較,但grep
運行良好,或者你可以使用case語句:
case "$line" in
*$word*) echo $line;;
esac
另一種解決方案是使用循環:
for w in $line
do
if [ "$w" == "$word" ]; then
echo $line
break
fi
done
代碼片段:
$a='text'
$b='text'
if [ $a -eq $b ]
then
msg='equal'
fi
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.