Here文档(Heredoc)是一种输入或文件流文字,被视为特殊的代码块。这个代码块将被传递给命令进行处理。Heredoc起源于UNIX Shell,可以在shell中找到,如sh、tcsh、ksh、bash、zsh、csh。值得注意的是,其他编程语言如Perl、Ruby、PHP也支持heredoc。
文章目录
<<
)后跟一个分隔符令牌。相同的分隔符令牌将用于终止代码块。在分隔符内出现的任何内容都被视为代码块。看下面的示例。我正在将代码块重定向到cat命令。这里,分隔符设置为“BLOCK”,并以相同的“BLOCK”终止。
cat << **BLOCK**
Hello world
Today date is $(date +%F)
My home directory = ${HOME}
**BLOCK**
注意:你应该使用相同的分隔符令牌来开始和终止代码块。如果你现在在bash中编码,你可能知道bash默认不支持像C或Java那样的多行注释。你可以使用HereDoc来克服这个问题。
这不是bash支持多行注释的内置特性,而只是一种技巧。如果你没有将heredoc重定向到任何命令,解释器将简单地读取代码块,而不会执行任何操作。
<< **COMMENT**
This is comment line 1
This is comment line 2
This is comment line 3
**COMMENT**
(<<)
后添加dash (-)
,然后是一个分隔符,来覆盖这种行为。这将抑制所有的制表符空格,但不会抑制空格。cat <<- BLOCK
This line has no whitespace.
This line has 2 white spaces at the beginning.
This line has a single tab.
This line has 2 tabs.
This line has 3 tabs.
BLOCK
Heredoc接受变量替换。变量可以是用户定义的变量或环境变量。
TODAY=$(date +%F)
cat << BLOCK1
# User defined variables
Today date is = ${TODAY}
#Environ Variables
I am running as = ${USER}
My home dir is = ${HOME}
I am using ${SHELL} as my shell
BLOCK1
类似地,你可以在Heredoc代码块内运行任何命令。
cat << BLOCK2
$(uname -a)
BLOCK2
有几种方法可以转义特殊字符。你可以在字符级别或文档级别进行转义。
要转义单个特殊字符,请使用反斜杠 (\)。
cat << BLOCK4
$(uname -a)
BLOCK4
cat << BLOCK5
Today date is = ${TODAY}
BLOCK5
要转义代码块内的所有特殊字符,请用单引号、双引号包围分隔符,或在分隔符前加反斜杠。
cat << 'BLOCK1'
I am running as = ${USER}
BLOCK1
cat << "BLOCK2"
I am running as = ${USER}
BLOCK2
cat << \BLOCK3
I am running as = ${USER}
BLOCK3
现在已经了解了Heredoc的结构和工作原理,最常用的场景是在通过SSH运行命令块和通过Heredoc传递SQL查询。
在下面的示例中,将一个select语句传递给psql,以连接到数据库并运行查询。这是在bash脚本中运行psql查询的一种替代方法,而不是使用-f
标志来运行.sql文件。#!/usr/bin/env bash
UNAME=postgres
DBNAME=testing
psql --username=${UNAME} --password --dbname=${DBNAME} << BLOCK
SELECT * FROM COUNTRIES
WHERE region_id = 4;
BLOCK
Heredoc除了可以适用上面SSH的批量命令的场景,还可以适用更多的场景如多行字符串处理,发布等等场景。
深度了解tails系统:隐私保护的利器谷歌云 kcp协议: 详细使用教程及常见问题解答美国Shadowrocket Apple ID账号共享,iOS Shadowrocket下载Little Rocket 美国身份证租赁 (Little Rocket 身份证租赁)Shadowrocket VPN iOS详细指南深入探讨usr local sbin v2ray no such file or directoryappleid共享小火箭_小火箭的apple id账号共享全面了解v2ray账户如何找回我的 Google 帐户密码?Quantumult App Store: 详细教程与常见问题解答火箭星战试玩体验:独特宇宙探索与细腻美术表现力令人印象深刻隐私保护领域新势力!华控清交B轮融资5亿元Linux上自动启动shadowsocks-libev的方法最新v2ray免费高速节点: 节点获取、使用教程及常见问题解答v2ray DNS本地化配置指南流媒体机场 ︱解锁Netflix科学上网VPN梯子推荐白月光机场2025春节促销限时优惠码便宜按量不限时长付费机场推荐:八戒机场怎么样?提供1元试用套餐,不限制设备数Telegram(TG/电报)安装注册使用教程图文版翻墙机场排名