Bash:检查String中的特定字符并在其前面添加转义字符

时间:2017-03-15 04:11:13

标签: bash unix

我正在编写一个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'

3 个答案:

答案 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'