3

考虑有一个可变行和可变字:

line = 1234 abc xyz 5678
word = 1234

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

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

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

8 回答 8

4

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

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

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

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

于 2013-08-21T00:49:50.650 回答
4

无需if声明;只需使用grep

echo $line | grep "\b$word\b"
于 2013-08-21T00:04:21.837 回答
4

注意白色空间!

将变量设置为值时,不要在等号周围放置空格。当您的值在其中间隔时也使用引号:

line="1234 abc xyz 5678"   # Must have quotation marks
word=1234                  # Quotation marks are optional

使用比较时,必须在括号和比较符号周围留出空格:

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

注意双方括号。如果要进行模式匹配,则必须使用双方括号而不是单方括号。双方括号表示您在使用==or时正在执行模式匹配操作=。如果您使用单方括号:

if [ "$line" = *"$word"* ]

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

于 2013-08-21T01:05:20.950 回答
3

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

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

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

于 2013-08-21T07:45:44.210 回答
3
echo $line | grep "$word"

将是在脚本中执行此操作的典型方法,当然它确实需要一个新过程

于 2013-08-21T00:05:39.760 回答
1

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

case "$line" in
*$word*) echo $line;;
esac
于 2013-08-21T01:49:25.257 回答
0

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

for w in $line
do
    if [ "$w" == "$word" ]; then
        echo $line
        break
    fi
done
于 2013-08-21T01:06:44.387 回答
0

代码片段:

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

if [ $a -eq $b ]
 then
   msg='equal'
fi 
于 2016-04-14T06:20:28.043 回答