shell heredoc

shell中如果定义多行的字符串可以使用heredoc

先检查一下当前使用shell

echo $0
-bash

heredoc 是一种在 Shell 脚本、编程语言(例如 Bash、PHP、Ruby 等)中,用来定义多行字符串的方法。它可以使代码中的字符串定义更加清晰和可读,尤其适用于需要定义包含多行内容的文本块时。以下是 heredoc 的基本用法和一些示例。

Bash 中的 Heredoc 语法

在 Bash 中,heredoc 的语法如下:

command <<EOF
内容...
EOF
  • command 表示你要将这些多行内容传递给的命令,例如 catecho 等。
  • &lt;&lt;EOF 表示开始使用 heredoc,其中 EOF 是一个标识符,用来定义多行文本的结束位置。你可以使用其他标识符来替代 EOF,例如 END,但开始和结束的标识符必须一致。
  • 结束标识符必须单独一行,且通常没有前后的空格。

示例

1. 输出多行文本

你可以使用 heredoc 来输出多行文本:

cat <<EOF
这是第一行
这是第二行
这是第三行
EOF

输出结果为:

这是第一行
这是第二行
这是第三行

2. 写入文件

你可以将 heredoc 的内容重定向到一个文件:

cat < myfile.txt
这是要写入文件的内容
第二行
第三行
EOF

这会将文本块写入名为 myfile.txt 的文件中。

3. 结合命令

也可以将 heredoc 与其他命令结合使用,例如 while 循环:

while read line; do
echo "读取到: $line"
done <<EOF
行1
行2
行3
EOF

输出结果为:

读取到: 行1
读取到: 行2
读取到: 行3

可以通过在 heredoc 内插入命令替换符 $(...) 来执行命令,以下是一个示例:


cat <<EOF > insert_query.sql INSERT INTO my_table (id, name, time) VALUES (1, 'example_name', '$(date '+%Y-%m-%d %H:%M:%S')'); EOF cat insert_query.sql

输出结果为:

INSERT INTO my_table (id, name, time)
VALUES (1, 'example_name', '2024-11-12 10:45:30'); # 假设当前时间是 2024-11-12 10:45:30

这样你可以直接在 heredoc 中调用 date 命令来动态生成包含当前时间的 SQL 语句。

 

Heredoc 变种

  • 忽略缩进符号:在标识符前加上 -(如 <<-EOF),可以使缩进的内容被忽略,用于美化代码而不影响输出:
cat <<-EOF
这是内容的第一行
这是内容的第二行
EOF

这里的内容会忽略前面的缩进空格。使用 Ctrl + V + Tab 在某些终端输入 Tab 符号。

  • 变量插值:默认情况下,heredoc 会对内容中的变量进行插值(替换为变量的值):
name="Alice"
cat <<EOF
你好,$name!
EOF

输出为:

你好,Alice!
  • 禁止变量插值:如果不希望对内容中的变量进行插值,可以使用单引号包围结束标识符:
cat <<'EOF'
你好,$name!
EOF

输出为:

你好,$name!

使用场景

  1. 输出多行提示信息:可以用于脚本中输出多行提示信息,提高可读性。
  2. 生成配置文件:可以方便地生成配置文件的内容。
  3. 处理多行文本输入:适用于将多行文本传递给命令或函数。

heredoc 提供了一种灵活和直观的方式来处理多行文本,使得代码更加易读。

bash, zsh heredoc使用放到相同csh,tcsh对heredoc支持有限

 

图片from西莉亞玩樂人生

Comments are closed.