私は 2 つのコマンド ライン引数 (たとえば、1 つはディレクトリ名、もう 1 つはシンボル (任意のシンボルは $、£、^、* など)) を受け入れるスクリプトを作成しようとしています。次に、ディレクトリにそのシンボルを含むファイル名があるかどうかを確認し、ない場合はディレクトリにシンボルを追加します。
testDir
したがって、最初の引数としてというディレクトリを探し、 *
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 の問題が疑われますので、質問を編集して、実際に何をしようとしているのかを説明することをお勧めします。