1

コマンドラインの構文エラーを解消するにはどうすればよいですか? 次のような bash スクリプトを作成しました。

#!/bin/bash

USER="$@"

sed 's/[!@#\$%^&*()]//g'> $@
done

if ! [ -f $@ -a -r $@ ] ; then
 echo "Wrong Option : "${USER}" is not readable or not exist" >&2
 exit -1
fi

cat "${@}"|while read -r line
do
IFS=, read -r f1 f2 f3 f4 f5 <<< "$line"
mysql --user=user --password=password --database=database <<EOF
INSERT INTO table_name VALUES($f1,'$f2','$f3','$f4',$f5);
EOF
done

そして、このスクリプトを他の端末で次のように実行します。

$ ./script.sh test!rr.txt
-bash: !rr.txt: event not found

実際には、これはテキスト ファイルからデータベース テーブルにデータを挿入するスクリプトです。ご覧のとおり、テキスト ファイルを挿入する前にファイルの存在を確認したいと考えています。

コマンドラインの構文エラーを解消するために tr -d コマンドと sed コマンドを使用しようとしましたが、うまくいかないと思います..

私の期待は次のとおりです。

$ ./script.sh test!rr.txt
Wrong Option : test!rr.txt is not readable or not exist

何か考えはありますか?ありがとう。

4

4 に答える 4

2

シェルは!、行を評価する前に履歴コマンドとして解釈しています。エスケープしてみてください:

$ ./script.sh test\!rr.txt
于 2012-05-01T16:23:56.220 に答える
2

ファイル名に bash の特殊文字を含める場合は、ファイル名を引用符で囲みます。

$ ./script.sh 'test!rr.txt'
于 2012-05-01T16:24:06.890 に答える
2

これは、期待を調整する必要がある場合です。Bash は、単に指示されたことを実行するだけです。スクリプトに引数を渡す前に、履歴の展開を実行します。引数を引用するか、それ以外の場合は「!」をエスケープすることに関する他の回答 すべて正しいですが、引数がスクリプトに渡される前に履歴の展開が行われていることを認識していると想定しています (ファイルが存在することを確認できます)。

于 2012-05-01T16:29:23.340 に答える
1

パラメータを引用符で囲んで、シェルが特殊記号を解釈しないようにします。

$ ./script.sh "test!rr.txt"
于 2012-05-01T16:24:23.130 に答える