script01.sh工作得很好
#!/bin/sh -x
egrep 'snmp.* version [123]|ip route ' $1
输出
[user@linux ~]$ script01.sh file.txt
+ egrep 'snmp.* version [123]|ip route ' file.txt
但是,当我更改内容并将其放入变量中时,它就中断了。
script02.sh
#!/bin/sh -x
var='snmp.* version [123]|ip route '
egrep $var $1
输出脚本02.sh
[user@linux ~]$ script02.sh file.txt
' x='snmp.* version [123]|ip route
+ egrep 'snmp.*' version '[123]|ip' route $'\r' file.txt
egrep: version: No such file or directory
egrep: [123]|ip: No such file or directory
egrep: route: No such file or directory
: No such file or directory
当我双引号$var
&时$1
,就会发生这种情况。
脚本03
#!/bin/sh -x
var='snmp.* version [123]|ip route '
egrep "$var" "$1"
输出脚本03
[user@linux ~]$ script03.sh file.txt
' var='snmp.* version [123]|ip route
' file.txt
答案1
$var
您的脚本会中断,因为您在命令行上使用不带引号的egrep
.这会导致 shell 将其拆分为空格、制表符和换行符(默认情况下)上的单独单词,并且每个单词在使用生成的单词调用snmp.*
之前也会进行文件名通配(例如,将扩展到当前目录中的所有匹配文件名)egrep
。
既然egrep
只会认第一的非选项参数作为模式,其余参数假定为文件名。
相反,做
#!/bin/sh -x
pattern='snmp.* version [123]|ip route '
grep -E -n --color=auto -e "$pattern" "$1"
grep -E
与 and 相同egrep
,因为我们将要匹配的模式放入变量中,所以我想明确告诉grep
参数之一是 的模式-e
。除此之外,我对所有变量扩展进行双引号以避免上述 shell 会对变量值执行的分词和通配符操作(请注意,这$1
也会受此影响)。
您的脚本似乎还至少有一些以\r
(回车符)结尾的行,就好像它们是 DOS 文本行一样。如果您使用 Windows 文本编辑器编写脚本,则可能会发生这种情况。要将脚本转换为 Unix 文本文件,请dos2unix
在脚本文件上使用。
也可以看看
通过小的修改,您的脚本可以处理命令行上给出的多个文件:
#!/bin/sh -x
pattern='snmp.* version [123]|ip route '
for pathname do
grep -E -n --color=auto -e "$pattern" "$pathname"
done