シェルプログラミングアスタリスク(アスタリスク「*」)ピット

シェルプログラミングについてのワイルドカード今日に起因する問題を共有。

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

まず、シェルスクリプトの実行の原則を教えて:

  1. シェルスクリプトは、ファイル全体を読み取り、その後、上から下に各行を実行します
  2. 現在の行= 4567890 *、シェルを想定した場合に実行echo $line >> $i.txtするとき
    1. まず、交換を担当するシェル$line値:4567890 *、このタイムコードは次のとおりです。echo 4567890 * >> $i.txt
    2. その後、echoコマンドを実行する前に、シェルはコマンドのパラメータが存在するかどうかを確認するには、ワイルドカード(:今回エコーパラメータ:4567890 * PS)は
    3. 明らかに、*ワイルドカードは、シェルがワイルドカードを解析するための責任がある、シェルがディスク上に一致させることがあり、ワイルドカード検索パスまたはファイル名として扱われます:彼らは試合の要件を満たす場合、(パス拡張)を交換することが、そうでない場合は、ワイルドカードとして通常の文字パラメータは、エコーに渡され、その後、エコーによって処理されます。
    4. ワイルドカード解析した後*に交換されscript.sh test.logs、この時点でのパラメータは、エコーコマンドは次のとおりです。4567890 script.sh test.logs
    5. 最後に、シェルの実行はecho 4567890 script.sh test.logs、その後、結果がファイルにリダイレクトコマンドの実行をエコー。

チップ:

ワイルドカードビット正規表現のように見えますが、それは正規表現と異なり、互いに混同してはなりません。ワイルドカードの特殊文字は、シェルが扱うことができるとして理解することができます。そして、シェルのワイルドカードのみが関与 "*、?、[]、{}" これらのタイプ。

ワイルドカードは、シェル自体によってサポートされていますが、正規表現関連ツールのサポートを必要とされます。grep、awkは、VI、perlの 。ツールをフィルタリングテキストでは、正規表現などのawk、sedは、として、使用されている、正規表現は、ファイルの内容のためですワイルドカードは、ファイル名またはパスのために使用されているようにように検索、LS、CPとを見つけると、上。

3.ソリューション

上記の分析は、知ることができる$line置換された後、ワイルドカードが*再び解析されたシェルです。どのようにそれを解決するワイルドカード殻を防ぐためにどのような方法があることができますか?

  1. 使用参照変数:"$line"引用符を越え、これ"$line"の代わりに二つの別々の文字列の文字列「4567890 *」、となります。
  2. 参照変数の防止単語とワイルドカードの展開(すなわちシェル決意ワイルドカード)、および変数にスペースを防ぐことができ、改行、中断ワイルドカードスクリプトの原因のように。
  3. 使用し、常にシェルプログラミングで参照変数の道を、これは良いと安全なコーディングプラクティスです。

4.参考文献

  1. bashでファイルからアスタリスク(*)を読みます
  2. シェル変数の前後に引用符をラップするときは?
  3. bashで変数を引用し忘れるのセキュリティへの影響/ POSIXシェル
  4. シェルスクリプトでshellcheck.net-発見のバグ。
  5. Linuxのシェルのワイルドカードメタ文字は、例の紹介を使用してエスケープ

おすすめ

転載: www.cnblogs.com/wengle520/p/12459624.html