2012-05-01 8 views
1

コマンドラインで構文エラーを取り除くにはどうすればよいですか? 私はこのようなbashスクリプト作成:コマンドラインで構文エラーを取り除くにはどうすればよいですか?

#!/bin/bash 

USER="[email protected]" 

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

if ! [ -f [email protected] -a -r [email protected] ] ; 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 

はあなたを行います何か考えている?おかげさまで

答えて

2

シェルは、行を評価しようとする前に、履歴コマンドとして!を解釈しています。それをエスケープしてみてください。あなたのファイル名の周り

$ ./script.sh test\!rr.txt 
2

入れ引用符あなたがそれにbashの特殊文字を含める場合:

$ ./script.sh 'test!rr.txt' 
1

は、特殊記号を解釈するシェルを防ぐために、引用符でパラメータを置く:

$ ./script.sh "test!rr.txt" 
2

これは、あなたの期待を調整する必要がある場合です。 Bashはあなたが言ったことを単に実行しています:引数をスクリプトに渡す前に履歴拡張を実行してください。引数を引用するか、そうでなければ "!"をエスケープする他の答えは、すべて正しいですが、引数がスクリプトに渡される前に履歴拡張が行われていることを認識していると仮定しています(ファイルが存在することを確認できます)。

関連する問題