逃避shell脚本中的某些字符

时间:2012-08-14 01:33:20

标签: linux bash shell unix hive

这是我用于查询hive表的下面的shell脚本,我将此文件保存为test4.sh

#!/bin/bash

DATE_YEST_FORMAT1=`perl -e 'use POSIX qw(strftime); print strftime "%Y-%m-%d",localtime(time()- 3600*96);'`
echo $DATE_YEST_FORMAT1

QUERY1=`hive -e "
set mapred.job.queue.name=hdmi-technology;
SELECT split(ckey, '\\|') AS t1
                    ,created_time
                FROM (
                    SELECT CONCAT (
                            buyer_id
                            ,'|'
                            ,item_id
                            ) AS ckey
                        ,created_time
                    FROM dw_checkout_trans
                    WHERE to_date(from_unixtime(cast(UNIX_TIMESTAMP(created_time) AS BIGINT))) = '$DATE_YEST_FORMAT1' distribute BY ckey sort BY ckey
                        ,created_time DESC
                    ) a
                WHERE rank(ckey) < 1;"`

问题陈述: -

我正在运行上面的shell脚本 -

bash -x test4.sh

如果您在上面hive sql query中看到这一行:

**SELECT split(ckey, '\\|') AS t1**.  

我是否需要转义斜杠符号才能使其在shell脚本中工作?

1 个答案:

答案 0 :(得分:1)

内部反引号和双引号,你基本上需要加倍你的反斜杠,是的。如果反斜杠不是已知的转义序列,它将被保留。

bash$ echo "foo\bar"
foo\bar

bash$ echo "foo\\bar"
foo\bar

bash$ echo "split(ckey, '\\|')"
split(ckey, '\|')

因此,如果您希望hive在那里看到双反斜杠,则需要在Bash脚本中添加四个反斜杠。

进一步查看,例如http://tldp.org/LDP/Bash-Beginners-Guide/html/sect_03_03.html