美文网首页
EOF==here-document

EOF==here-document

作者: 一片冰心一生平安 | 来源:发表于2018-07-20 17:24 被阅读0次

    执行脚本的时候,往一个文件里自动输入N行内容。
    如果是少数的几行内容,可以用echo追加方式;

    [root@work1 ~]# echo "show global status where Variable_name='Uptime';" |  mysql -N | awk '{print $2}'
    85126
    
    #
       --skip-column-names, -N
    
               Do not write column names in results.
    

    如果是很多行,就可以使用EOF结合cat命令进行行内容的追加。

    注意,
    1.紧挨着EOF 后面的,是一条shell命令[可选]。只有在出现输入提示符">"(>表示新行,在脚本中不用输入>只需另起新行)后输入的内容才正式为EOF匹配的内容段。
    2.若文件不存在,EOF命令中会自动创建。

    例,
    cat << EOF >test.sh 
    apple
    
    1234567890
    very,good!
    EOF
    
    等价于
    cat >test.sh << EOF 
    apple
    
    1234567890
    very,good!
    EOF
    
    解释:
    登录mysql库(mysql $DATABASE),查询user表(通过here-document方式追加select user from $TABLE;),然后|管道给tail,tail 输出从第2行开始的记录
    
    [root@work1 mysql]# TABLE=user
    [root@work1 mysql]# DATABASE=mysql
    [root@work1 mysql]# depts=`mysql $DATABASE <<aaa | tail -n +2
    > select user from $TABLE;
    > aaa`
    [root@work1 mysql]# echo $depts
    root root zabbix root zabbix
    [root@work1 mysql]# 
    

    1、在命令行环境下,使用cat <<EOF 和 cat <<-EOF,两个都是获取stdin,并在EOF处结束stdin,输出stdout。

    在我们使用cat <<EOF时,我们输入完成后,需要在一个新的一行输入EOF结束stdin的输入。EOF必须顶行写,前面不能用制表符或者空格。比如,下面的语句就不会出错:

    例1:

    <span style="font-size:18px;">cat <<EOF  
    Hello,world!  
    EOF</span>
    
    

    如果结束分解符EOF前有制表符或者空格,则EOF不会被当做结束分界符,只会继续被当做stdin来输入。而<<-就是为了解决这一问题:

    例2:

    cat <<-EOF  
    Hello,world!  
          EOF   
    

    上面的写法,虽然最后的EOF前面有多个制表符和空格,但仍然会被当做结束分界符,表示stdin的结束。
    这就是<<和<<-的区别。

    相关文章

      网友评论

          本文标题:EOF==here-document

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