使用变量时脚本中断

使用变量时脚本中断

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

相关内容