云网牛站
所在位置:首页 > Linux命令 > Linux下Bash Heredoc(Here document)的用法及基本示例

Linux下Bash Heredoc(Here document)的用法及基本示例

2021-01-05 11:48:29作者:游俊梧稿源:云网牛站

本文讲解在Linux操作系统下Bash Heredoc(Here document)的用法,及基本的Heredoc示例、将Heredoc和SSH一起使用。

Linux下Bash Heredoc(Here document)的用法及基本示例

 

简介

在编写shell脚本时,您可能需要将多行文本或代码传递给交互式命令(例如tee、cat或sftp)。

在Bash和Zsh等其他shell中,Here document(Heredoc)是一种重定向类型,允许您将多行输入传递给命令。

 

Heredoc用法

编写Bash Heredoc(Here document)的用法采用以下形式:

[COMMAND] <<[-] 'DELIMITER'

 HERE-DOCUMENT

DELIMITER

说明:

1、第一行以可选命令开头,后跟特殊重定向操作符<<和定界标识符。

您可以使用任何字符串作为分隔标识符,最常用的是EOF或END。

如果未使用定界标识符,则在将此处文档行传递给命令之前,shell将替换所有变量、命令和特殊字符。

在重定向运算符<<-后面加上减号将导致所有前导制表符被忽略。这使您可以在Shell程序脚本中编写此处文档时使用缩进。不允许使用前导空格字符,只能使用制表符。

2、here-document处可以包含字符串、变量、命令和任何其他类型的输入。

3、最后一行以定界标识符结尾,分隔符前面不允许有空格。

 

基本的Heredoc示例

下面,我们将介绍一些如何使用heredoc的基本示例。

Heredoc最常与cat命令结合使用,参考cat命令_Linux cat命令使用详解:连接文件并打印到标准输出设备上

在下面的示例中,我们传递了两行文本,其中包含一个环境变量和一个使用here文档进行分类的命令:

cat << EOF

The current working directory is: $PWD

You are logged in as: $(whoami)

EOF

从下面的输出中可以看到,变量和命令输出都被替换了:

The current working directory is: /home/ywnz

You are logged in as: ywnz

让我们看看如果将定界符括在单引号或双引号中会发生什么:

cat <<- "EOF"

The current working directory is: $PWD

You are logged in as: $(whoami)

EOF

您会注意到,当用引号引起来时,shell不会进行任何参数扩展和命令替换:

The current working directory is: $PWD

You are logged in as: $(whoami)

如果在语句或循环中使用Heredoc,请使用<<-重定向操作,使您可以缩进代码:

if true; then

  cat <<- EOF

  Line with a leading tab.

  EOF

fi

返回:

Line with a leading tab.

您可以使用>,>>运算符将输出重定向到文件,而不是在屏幕上显示输出:

cat << EOF > file.txt

The current working directory is: $PWD

You are logged in as: $(whoami)

EOF

如果file.txt不存在,它将被创建。使用>时,文件将被覆盖,而>>则将输出附加到文件。

Heredoc输入也可以通过管道传递。在以下示例中,sed命令将用e替换l字符的所有实例,参考sed命令_Linux sed命令使用详解:功能强大的流式文本编辑器

cat <<'EOF' |  sed 's/l/e/g'

Hello

World

EOF

返回:

Heeeo

Wored

要将管道数据写入文件:

cat <<'EOF' |  sed 's/l/e/g' > file.txt

Hello

World

EOF

 

将Heredoc和SSH一起使用

使用Heredoc可以便捷的达到通过SSH在远程系统上执行多个命令。参考ssh命令_Linux ssh命令使用详解:openssh套件中的客户端连接工具

使用不带引号的定界符时,请确保转义所有变量,命令和特殊字符,否则它们将在本地插入:

ssh -T user@host.com << EOF

echo "The current local working directory is: $PWD"

echo "The current remote working directory is: \$PWD"

EOF

返回:

The current local working directory is: /home/ywnz

The current remote working directory is: /home/user

您可能还希望设置基于SSH密钥的身份验证并连接Linux服务器而不输入密码,可根据需求来设置。

 

相关主题

bash命令_Linux bash命令使用详解:为GNU计划编写的Unix shell

Linux命令子频道
精选文章
热门文章