如何在命令行中消除语法错误? 我创建了一个像这样的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
你知道吗?
感谢。
答案 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"