`
febird
  • 浏览: 254276 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

shell heredoc 微妙之处

 
阅读更多

here doc 的一般用法:

[cmd] <<word
   here-document
delimiter

 

可以把 heredoc 的内容放进文件,也可以放进 shell 变量,参见以下代码:

#!/bin/sh

# write heredoc text to file
cat > file <<EOF
some text write to file
EOF

# show file
cat file

# save heredoc text to var
var=`cat << EOF
some text save to var
EOF
`
# show var
echo $var


 

使用`` 捕获 heredoc 内容比较丑陋,但这是我目前能找到的不需要中间文件就可以将heredoc内容存到变量中的唯一方式($(..)也可以,但似乎更丑陋,并且移植性更差)。我觉得比较好的捕获heredoc内容的方式应该象这样,不需要在delimiter 之后再放一个标记:

capture var <<"EOF"
 some text 
EOF

 

然而有两点需要注意:

当word中含有双引号(" )时,heredoc结束标记(delimiter )需要写成 按shell 移除引号的规则 移除引号之后 的形式。比如:

word="EOF"

delimiter=EOF

word= "EOF"here"doc1"

delimiter=EOFheredoc1

在这种情况下(word中包含引号),heredoc的文本内容会原原本本地输出,而不会被shell扩展。 反之 (word中无引号) heredoc的内容会按shell扩展规则被扩展,例如将$1扩展成参数等等,并且 \newline 会被删除。

 

还有一种情况,就是重定向 符号 << 可以使用 <<- ,在这种情况下,heredoc 文本中的前导 tab 字符会被删除,还有一点我没太看明白,也没试验出来( all leading tab characters will be stripped from input lines and the line containing the trailing delimiter )。

 

可以使用 heredoc 直接在 shell 中写比较复杂的 awk 程序,比直接在在引号中写要可读、易懂得多:

#!/bin/sh

if [ $# -lt 1 ]
then
        echo usage: $0 files
        exit 1
fi

prog=`cat <<"EOF"
{ count[$1] += $2; } 
END{
   for (k in count) {
        printf "%s\t%d\n", k, count[k];
   }
}
EOF
`
awk "$prog" "$@"

 

 

@see opengroup 上的文档

分享到:
评论

相关推荐

    shell_ftp实现

    - `这是Shell脚本中的here文档(heredoc),用来传递多行输入给命令或程序。 2. **连接FTP服务器**: - `open 10.1.128.112 3839`: 使用`open`命令连接到FTP服务器,其中`10.1.128.112`是服务器的IP地址,而`3839...

    shell 基本语法

    Here documents(也称为heredoc)用于创建多行文本块。 **示例代码:** ```sh #!/bin/sh # 使用here document cat This is a multi-line string. It can span multiple lines. And it preserves whitespace. EOF `...

    shell 和 XFtp6

    然后通过`lftp`的命令行会话(heredoc)来执行`mirror`命令,实现远程目录到本地的下载,并删除本地已不存在的文件。 如果需要定时运行这个脚本,可以将其添加到系统的cron job中。例如,如果想每天凌晨1点执行该...

    PHP EOF(heredoc) 使用说明

    PHP EOF(heredoc)是一种在命令行shell(如sh、csh、ksh、bash、PowerShell和zsh)和程序语言(像Perl、PHP、Python和Ruby)里定义一个字符串的方法。 使用概述: 1. 必须后接分号,否则编译通不过。 2. EOF 可以用...

    编的一个linux Shell ,能实现管道,重定向,以及一些基本的Shell 编程功能.zip

    - `这里字符串重定向(heredoc),常用于批量输入,例如在脚本中向程序提供多行文本。 **Shell编程** Shell编程涉及编写Shell脚本,即包含一系列命令的文本文件。这些脚本可以执行自动化任务,如文件管理、系统维护...

    Filter-Heredoc:Filter-Heredoc 的只读发布历史

    Filter::Heredoc 从符合 POSIX IEEE Std 1003.1-2008 的 shell 脚本中提取此处的文档。 Perl 派生出类似的 here 文档语法,但同时在许多细节上有所不同。 Perls here 文档将被支持,但在初始版本中是实验性的。概要...

    php中heredoc与nowdoc介绍

    首先,让我们了解Heredoc技术。 Heredoc是一种用于PHP中定义字符串的方法,尤其在输出包含大量文本或HTML代码时非常有用。它的语法以标签开始,紧跟着一个自定义的结束标签,结束标签后需要加上分号。需要注意的是...

    Linux详细教程大全之shell脚本基础4-管道IO重定向等.docx

    - `用于输入的追加,如heredoc(多行输入)。 示例: - 将命令的输出和错误都重定向到同一个文件:`command &gt; outfile 2&gt;&1` - 丢弃错误输出:`command 2&gt; /dev/null` 3. **脚本组成与运行**: - 脚本通常以`...

    解析php中heredoc的使用方法

    如果需要在Heredoc内执行函数,那么应当将函数调用放在Heredoc外部。这样,函数调用的结果可以被赋值给变量,然后该变量再被插入到Heredoc中。 例如: ```php $name = "浅水游"; $str = ;charset=gb2312"/&gt; ...

    heredoc:npm模块

    Heredoc JavaScript的多行字符串 用法 该技术利用了Function.prototype.toString() var heredoc = require ( 'heredoc' ) var str = heredoc ( function ( ) { /* within this comment block, any text will ...

    PHP中nowdoc和heredoc使用需要注意的一点

    关于heredoc和nowdoc的选择,如果你需要在字符串中插入动态内容(即变量),那么heredoc更合适。但如果你希望字符串保持原始的文本形式,不包含任何PHP代码,nowdoc是一个更好的选择,因为它具有更高的效率,不会...

    heredoc-matlab:MATLAB 的 Heredoc 解决方案允许轻松操作多行字符串-matlab开发

    MATLAB 的一个长期问题是多行字符串的处理。 例如,嵌入式 SQL 查询: sql = [ 'SELECT * FROM tbl1' ... 'INNER JOIN tbl2' ... 哎呀我们忘了这里的... 该工具允许使用与 Unix shell 和/或 Python 类似的语法将这些

    php heredoc和phpwind的模板技术使用方法小结

    Heredoc的基本语法结构如下: ```php echo 这是多行字符串 这里可以包含变量,比如:$var END; ``` 这里的`END`是一个标识符,用于结束Heredoc字符串。需要注意的是,这个标识符必须以不带任何字符(包括空格和...

    Multi-line-strings-called-Heredoc-:编程中的多行字符串通常称为“ Heredocs”

    当我们需要在变量,函数或注释的内容上添加一些段落时,必须在总文本内容的开头和结尾处使用三个引号。 如果我们使用单引号,则Python的解释器将引发错误。 让我们来看一个例子! paragraph = "Nullam id dolor id...

    vim-ruby-heredoc-syntax:vim插件,用于在ruby here文档中高亮显示代码

    vim-ruby-heredoc语法这样可以在Ruby此处的文档代码块中突出显示语法。安装使用neobundle.vim: NeoBundle ' joker1007/vim-ruby-heredoc-syntax '对于neosnippet和context_filetype 如果您有context_filetype.vim...

    mintpl:支持内联 heredoc 模板的迷你 Javascript 模板引擎

    `MintPL`是一个轻量级的JavaScript模板引擎,它的特色在于支持内联`heredoc`模板语法,使得模板编写更加简洁和直观。 ## 一、Heredoc模板语法 `heredoc`是一种多行字符串的表示方式,源自Perl语言,后来也被其他...

Global site tag (gtag.js) - Google Analytics