脚本中嵌入多行文本输入(EOF)

在 Shell 脚本中,EOF(End Of File)通常与 ‌Here Document‌(简称 heredoc)语法结合使用,用于在脚本中嵌入多行文本输入。其核心作用是‌标记多行文本的起始和结束位置‌,常用于生成文件、向命令传递多行数据或简化复杂输入操作。

基本用法

  1. 直接生成文件‌
    通过 cat 命令快速创建文件(无需逐行 echo):
cat > output.txt << EOF
第一行内容
第二行内容:$(date)  # 支持命令替换
变量示例:$HOME      # 支持变量替换
EOF

生成的 output.txt 内容:

第一行内容
第二行内容:Tue Jul 25 12:00:00 CST 2023
变量示例:/home/user

‌2. 向交互式命令传递输入
自动回答交互式命令的问题(如 mysql、ftp):

mysql -u root -p << EOF
SHOW DATABASES;
CREATE DATABASE test_db;
EXIT;
EOF

‌3. 嵌入多行字符串到脚本变量‌
将多行文本赋值给变量:

read -r -d '' message << EOF
这是一个
多行文本
变量值示例
EOF
echo "$message"

关键细节与扩展用法

  1. 禁用变量/命令替换‌
    在结束标记前加单引号(<< 'EOF'),所有内容按原样处理:
cat << 'EOF'
当前路径:$PWD   # 不会替换为实际路径
时间:$(date)    # 不会执行命令
EOF

输出:

当前路径:$PWD
时间:$(date)

‌2. 缩进文本内容‌
使用 <<- 忽略行首的制表符(‌Tab‌),允许缩进:

cat <<- EOF
    第一行(Tab缩进)
    第二行(Tab缩进)
EOF

输出:

第一行(Tab缩进)
第二行(Tab缩进)

注意‌:只能忽略 ‌Tab‌,空格缩进会报错。

‌3. 嵌套使用 EOF‌
需转义内部结束标记(如 \EOF):

cat << EOF
外层内容
cat << \EOF   # 内层结束标记被转义
内层内容
EOF
EOF

输出:

外层内容
cat << EOF
内层内容
EOF
posted @ 2025-04-14 15:47  老牛的田  阅读(98)  评论(0)    收藏  举报