考虑有一个可变行和可变字:
line = 1234 abc xyz 5678
word = 1234
这些变量的值是从 2 个不同的文件中读取的。
如果它包含单词,我想打印该行。如何使用 shell 脚本执行此操作?我尝试了之前问题中给出的所有建议解决方案。例如,即使单词不在行中,以下代码也始终通过。
if [ "$line"==*"$word"*]; then
echo $line
fi
您可以使用if [[ "$line" == *"$word"* ]]
您还需要使用以下内容来分配变量
line="1234 abc xyz 5678"
word="1234"
工作示例——http: //ideone.com/drLidd
无需if
声明;只需使用grep
:
echo $line | grep "\b$word\b"
将变量设置为值时,不要在等号周围放置空格。当您的值在其中间隔时也使用引号:
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"* ]
你在做平等。请注意,双方括号不需要引号,而单方括号在大多数情况下是必需的。
您可以使用 bash 匹配运算符=~
:
[[ "$line" =~ "$word" ]] && echo "$line"
不要忘记引号,如先前的答案(尤其是@Bill 的答案)所述。
echo $line | grep "$word"
将是在脚本中执行此操作的典型方法,当然它确实需要一个新过程
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
另一种解决方案是使用循环:
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