簡體   English   中英

shell腳本中2個字符串變量的比較

[英]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.

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