シェルプログラミングについてのワイルドカード今日に起因する問題を共有。
1.問題のコード
猫test.logs
4567890 *
##*************************************##
rtyuio**tyuio432
##*************************************##
*rtyuiop*2* yuiop
##*************************************##
rtyuiop(3 * 4)iuytr
##*************************************##
8765432
猫script.sh
#!/usr/bin/env bash
# 主要功能是将 非##开头 的每行记录写入到文件中,每个文件保存一行记录
logsname=test.logs
i=100
while read line
do
if [[ $line =~ '##' ]];then
((i++))
else
echo $line >> $i.txt
fi
done < "${logsname}"
Script.shは、スクリプトの結果を実行します。
以下からの写真赤のボックスセクションあなたが見ることができます:
4567890 *
交換される4567890 script.sh test.logs
rtyuiop(3 * 4)iuytr
に置き換えられrtyuiop(3 100.txt 101.txt 102.txt script.sh test.logs 4)iuytr
その他の行通常の印刷結果は、なぜこれらの2行は問題がありますか?他の行にもアスタリスクを持って、なぜそれを交換しませんか?
2.分析
問題に基づいてコードの出力:echo $line >> $i.txt
まず、シェルスクリプトの実行の原則を教えて:
- シェルスクリプトは、ファイル全体を読み取り、その後、上から下に各行を実行します
- 現在の行= 4567890 *、シェルを想定した場合に実行
echo $line >> $i.txt
するとき- まず、交換を担当するシェル
$line
値:4567890 *、このタイムコードは次のとおりです。echo 4567890 * >> $i.txt
- その後、echoコマンドを実行する前に、シェルはコマンドのパラメータが存在するかどうかを確認するには、ワイルドカード(:今回エコーパラメータ:4567890 * PS)は
- 明らかに、
*
ワイルドカードは、シェルがワイルドカードを解析するための責任がある、シェルがディスク上に一致させることがあり、ワイルドカード検索パスまたはファイル名として扱われます:彼らは試合の要件を満たす場合、(パス拡張)を交換することが、そうでない場合は、ワイルドカードとして通常の文字パラメータは、エコーに渡され、その後、エコーによって処理されます。 - ワイルドカード解析した後
*
に交換されscript.sh test.logs
、この時点でのパラメータは、エコーコマンドは次のとおりです。4567890 script.sh test.logs
- 最後に、シェルの実行は
echo 4567890 script.sh test.logs
、その後、結果がファイルにリダイレクトコマンドの実行をエコー。
- まず、交換を担当するシェル
チップ:
ワイルドカードビット正規表現のように見えますが、それは正規表現と異なり、互いに混同してはなりません。ワイルドカードの特殊文字は、シェルが扱うことができるとして理解することができます。そして、シェルのワイルドカードのみが関与 "*、?、[]、{}" これらのタイプ。
ワイルドカードは、シェル自体によってサポートされていますが、正規表現関連ツールのサポートを必要とされます。grep、awkは、VI、perlの 。ツールをフィルタリングテキストでは、正規表現などのawk、sedは、として、使用されている、正規表現は、ファイルの内容のためです。ワイルドカードは、ファイル名またはパスのために使用されているようにように検索、LS、CPとを見つけると、上。
3.ソリューション
上記の分析は、知ることができる$line
置換された後、ワイルドカードが*
再び解析されたシェルです。どのようにそれを解決するワイルドカード殻を防ぐためにどのような方法があることができますか?
- 使用参照変数:
"$line"
、引用符を越え、これ"$line"
の代わりに二つの別々の文字列の文字列「4567890 *」、となります。 - 参照変数の防止単語とワイルドカードの展開(すなわちシェル決意ワイルドカード)、および変数にスペースを防ぐことができ、改行、中断ワイルドカードスクリプトの原因のように。
- 使用し、常にシェルプログラミングで参照変数の道を、これは良いと安全なコーディングプラクティスです。