我正在编写一个Unix脚本来导出Oracle dmp文件,这些文件接收从数据库中获取的一些值,并形成如下所示的查询字符串:
exp $USER/$DBPASSWD@$ORACLE_SID file=CARD_TABLE.dmp tables=CARD_TABLE statistics=none query=\"where customer_idno=\'$bsccstid\'\"
$bsccstid
的值可能包含括号,例如 VIP-1220(A),并使exp命令无效。我是否应该知道如何检查括号并在其前面添加一个转义字符?
更新: 感谢这里的所有答案。对不起,如果我把你的问题弄糊涂了。我的目的是要求在括号前添加转义字符的解决方案。
echo "191-102-6863(A)" | sed 's/(/\\(/g;s/)/\\)/g'
答案 0 :(得分:2)
shell脚本的一个好的经验法则是双引所有变量扩展,除非您需要将变量扩展为多个单词。以下是对命令进行一些最小更改的示例,它引用了所有变量。
exp \
"$USER/$DBPASSWD@$ORACLE_SID" \
file=CARD_TABLE.dmp \
tables=CARD_TABLE \
statistics=none \
query="\"where customer_idno='$bsccstid'\""
答案 1 :(得分:0)
以下是您可能会如何攻击此问题的一个可能示例:
#!/usr/bin/env bash
bsccstid="VIP-1220(A)"
bsccstid=${bsccstid//(/\\(}
bsccstid=${bsccstid//)/\\)}
expindlist="('blah')"
tables=(CARD_TABLE CARD_OPT)
query=( "where cb_customer_idno = '$bsccstid'"
"where individual_acctno in $expindlist"
)
for t in "${!tables[@]}"
do
echo exp $USER/$DBPASSWD@$ORACLE_SID file="${tables[t]}.dmp" tables="${tables[t]}" statistics=none query="${query[t]}"
done
假设在运行上述内容时输出看起来准确,那么您可以简单地删除echo和exp命令实际运行
答案 2 :(得分:0)
转义括号的简短回答是使用sed。
echo "191-102-6863(A)" | sed 's/(/\\(/g;s/)/\\)/g'