shell脚本中2个字符串变量的比较

时间:2013-08-21 00:00:21

标签: bash shell

考虑有一个变量行和变量词:

line = 1234 abc xyz 5678
word = 1234

从2个不同的文件中读取这些变量的值。

如果包含单词,我想打印该行。我如何使用shell脚本执行此操作?我尝试了之前问题中给出的所有建议的解决方案。例如,即使单词不在行中,也始终传递以下代码。

if [ "$line"==*"$word"*]; then
    echo $line
fi

8 个答案:

答案 0 :(得分:4)

无需if声明;只需使用grep

echo $line | grep "\b$word\b"

答案 1 :(得分:4)

您可以使用if [[ "$line" == *"$word"* ]]

此外,您还需要使用以下内容来分配变量

line="1234 abc xyz 5678"
word="1234"

工作示例 - http://ideone.com/drLidd

答案 2 :(得分:4)

观看白色空间!

将变量设置为值时,请勿在等号周围放置空格。当值与其间隔时也使用引号:

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"* ]

你正在做平等。请注意,双方括号不需要引号,而大多数情况下需要单括号。

答案 3 :(得分:3)

echo $line | grep "$word"

将是在脚本中执行此操作的典型方式,当然它确实需要花费新流程

答案 4 :(得分:3)

您可以使用bash匹配运算符=~

 [[ "$line" =~ "$word" ]] && echo "$line"

不要忘记引号,如前面的答案中所述(尤其是@Bill)。

答案 5 :(得分:1)

if [ "$line"==*"$word"* ]无法按预期工作的原因可能有点模糊。假设不存在导致glob扩展的文件,那么您只是测试字符串1234 abc xyz 5678==*1234*是非空的。显然,这不是一个空字符串,所以条件总是正确的。您需要在==运算符周围放置空格,但这不起作用,因为您现在正在测试字符串1234 abc xyz 5678是否与glob *1234*展开的字符串相同,所以只有在执行shell脚本的进程的当前工作目录中存在名为1234 abc xyz 5678的文件时才会出现这种情况。有一些shell扩展允许这种比较,但grep运行良好,或者你可以使用case语句:

case "$line" in
*$word*) echo $line;;
esac

答案 6 :(得分:0)

另一种解决方案是使用循环:

for w in $line
do
    if [ "$w" == "$word" ]; then
        echo $line
        break
    fi
done

答案 7 :(得分:0)

代码段:

$a='text'
$b='text'

if [ $a -eq $b ]
 then
   msg='equal'
fi