本文讲解在Linux操作系统下Bash Heredoc(Here document)的用法,及基本的Heredoc示例、将Heredoc和SSH一起使用。
简介 在编写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服务器而不输入密码,可根据需求来设置。
相关主题 |