美文网首页
shell中多行文本的输出(使用cat/EOF)

shell中多行文本的输出(使用cat/EOF)

作者: 早点起床晒太阳 | 来源:发表于2020-09-12 10:55 被阅读0次

    参考资料
    https://my.oschina.net/wuweixiang/blog/2989375

    背景

    最近做项目写了个导数的脚本,其实就是在一个集群的数据拉取下来到另外一个集群上并且建表(机器不通只能先这么干),然后将表中的数据用spark坐下整理放到整理目录下。
    但是在建表的时候发生了些问题。

    出现的问题

    我的初衷是将建表语句在脚本中用如下表示

    sql=
    "
    create table xxx (
    xxx string
    )
    row foramte delilimited
    ...
    "
    

    这种形式,然后使用echo将变量输出重定向到当前目录的一个sql文件然后使用 hive -f 文件路径来建表
    发现报错如下

    (\n 'transient_lastDdlTime' = '1598093488'\n)\n': command not found

    注意: sql中不能有反引号,不然会被linux 识别成命令。

    反引号的定义:反引号在Linux shell命令行中有特殊的含义:反引号间的内容,会被shell先执行。其输出被放入主命令后,主命令再被执行。

    解决

    echo不适合做多行文本以及长文本的输出 涉及到多行文本(也支持变量替换)的情况 我们使用cat/EOF更合适

    具体形式(自己写的demo)

    cat >> create_table.sh << EOF 
    CREATE TABLE vbapfe4203ca074dad4e05551d39_parquet(column_0 BIGINT, column_1 STRING, column_2 BIGINT, column_3 BIGINT, column_4 STRING, column_5 STRING, column_6 STRING, column_7 BIGINT, column_8 BIGINT, column_9 BIGINT, column_10 BIGINT, column_11 BIGINT)
    ROW FORMAT SERDE 'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe'
    WITH SERDEPROPERTIES (
      'serialization.format' = '1'
    )
    STORED AS
      INPUTFORMAT 'org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat'
      OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat'
    TBLPROPERTIES (
      'transient_lastDdlTime' = '1598093488'
    )
    EOF
    

    这样就可以吧多行的文本输出到当前目录的create_table.sh中了。

    这里注意

    1、EOF是“end of file”,表示文本结束符。 EOF只是标识,不是固定的 (换成别的字符是一样的)

    2、cat >> create_table.sh << EOF 是表示将输出叠加到create_table.sh
    cat > create_table.sh << EOF 是表示将输出覆盖到create_table.sh

    相关文章

      网友评论

          本文标题:shell中多行文本的输出(使用cat/EOF)

          本文链接:https://www.haomeiwen.com/subject/weqwektx.html