コマンドライン引数を使用してシンボルを含むファイルを見つけると、予期しない結果が発生する

コマンドライン引数を使用してシンボルを含むファイルを見つけると、予期しない結果が発生する

2つのコマンドライン引数を受け入れるスクリプトを作成しようとしています。たとえば、1つはディレクトリ名、もう1つはシンボル(すべてのシンボルは$、£、^、*などです)です。次に、ディレクトリにシンボルを含むファイル名が含まれていること、およびシンボルがディレクトリに追加されていないことを確認する必要があります。

testDirしたがって、最初の引数と呼ばれるディレクトリを探し、aを*2番目の引数として使用すると、そのディレクトリ内のファイルを調べてそのシンボルがファイルに存在することを確認し、そうでない場合はそのディレクトリを呼び出します。testDir*

以下は私が開発したいコードです。

a1=$1  
  symbol=$(ls $a1 | grep $2)

   if [ "$symbol" != "" ]
     then
     echo "file has Symbol"

   else
     echo "The symbol was added to directory"
     mv $a1 $1$2
    fi

記号ではうまく機能しているようで、@特殊文字の影響を受けるようです。特殊文字をエスケープしながら特殊文字ではなく文字で作業する方法はありますか?

答え1

まず、決して良い考えではありません。lsファイル名が見つかったときに出力を解析します。これにより、単純なスペースを含む奇妙な文字が破損します。最良の方法は次のとおりです。シェルワイルドカードあるいはfindその逆も。

次の問題は、変数を引用しないことです。これはmv、コマンドを実行する前に特殊文字が拡張されることを意味します。スクリプトの実際の例は次のとおりです。

#!/usr/bin/env bash

if find "$1" -print0 | grep -z "$2" >/dev/null
then
    echo "file has Symbol" 
else
    echo  "The symbol was added to directory" 
    echo mv "$1" "$1$2" 
fi

警告する:なぜこれが起こるのか分からない。そうだろう。たとえば、ディレクトリを独自のサブディレクトリに移動しようとすると失敗します。ここにXYの問題があると疑われ、実際にやりたいことを説明するために質問を編集することをお勧めします。

関連情報