0

これは、ハイブテーブルを照会するために使用している以下のシェルスクリプトで、このファイルを次のように保存しました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;"`

問題文:-

上記のシェルスクリプトを次のように実行しています-

bash -x test4.sh

上記の行に次の行が表示された場合hive sql query:

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

シェル スクリプトで動作させるには、スラッシュ記号をエスケープする必要がありますか?

4

1 に答える 1

1

バッククォートと二重引用符の内側では、基本的にバックスラッシュを 2 つにする必要があります。ただし、バックスラッシュが既知のエスケープ シーケンスでない場合は保持されます。

bash$ echo "foo\bar"
foo\bar

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

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

したがって、そこに二重のバックスラッシュを表示したい場合hiveは、Bash スクリプトに 4 つのバックスラッシュを配置する必要があります。

さらに例を参照してくださいhttp://tldp.org/LDP/Bash-Beginners-Guide/html/sect_03_03.html

于 2012-08-14T04:07:52.677 に答える