考虑有一个变量行和变量词:
line = 1234 abc xyz 5678
word = 1234
从2个不同的文件中读取这些变量的值。
如果包含单词,我想打印该行。我如何使用shell脚本执行此操作?我尝试了之前问题中给出的所有建议的解决方案。例如,即使单词不在行中,也始终传递以下代码。
if [ "$line"==*"$word"*]; then
echo $line
fi
答案 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