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
。これにより、シェルはそれをスペース、タブ、および改行(デフォルト)から別々の単語に分割し、各単語は生成された単語のsnmp.*
前にもファイル名を付けます。 globbing(たとえば、現在のディレクトリで一致するすべてのファイル名は次に展開されます)egrep
。
egrep
私だけが認識しているから最初オプションでない引数はパターンとして使用され、残りの引数はファイル名と見なされます。
代わりに
#!/bin/sh -x
pattern='snmp.* version [123]|ip route '
grep -E -n --color=auto -e "$pattern" "$1"
grep -E
と と同じですegrep
。一致させたいパターンを変数に入れるので、パラメータのgrep
1つがパターンであると明示的に言いたいと思います-e
。これに加えて、シェルが変数値に対して実行する前述のトークン化とワイルドカードの指定を避けるために、すべての変数拡張を二重引用符で囲みました(これ$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