如何消除命令行中的语法错误?

时间:2012-05-01 16:21:27

标签: bash

如何在命令行中消除语法错误? 我创建了一个像这样的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 个答案:

答案 0 :(得分:2)

在尝试评估该行之前,shell正在将!解释为历史命令。尝试逃避它:

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

答案 1 :(得分:2)

如果要在其中包含bash特殊字符,请在文件名周围加上引号:

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

答案 2 :(得分:2)

这是您需要调整期望的情况。 Bash只是做你告诉它要做的事情:在将参数传递给你的脚本之前执行历史扩展。另一个答案是引用参数或以其他方式逃避“!”这些都是正确的,但他们假设你意识到历史扩展是在参数传递给你的脚本之前发生的(你可以检查文件是否存在)。

答案 3 :(得分:1)

将参数放在引号中以防止shell解释特殊符号:

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