# shell heredoc
Date: 2024-11-14


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

先检查一下当前使用shell

```bash
echo $0
-bash
```

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

### Bash 中的 Heredoc 语法

在 Bash 中，`heredoc` 的语法如下：

```bash
command <<EOF
内容...
EOF
```

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

### 示例

#### 1\. 输出多行文本

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

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

输出结果为：

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

#### 2\. 写入文件

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

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

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

#### 3\. 结合命令

也可以将 `heredoc` 与其他命令结合使用，例如 `while` 循环：

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

输出结果为：

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

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

```bash
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

```

输出结果为：

```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），可以使缩进的内容被忽略，用于美化代码而不影响输出：

```bash
cat <<-EOF
这是内容的第一行
这是内容的第二行
EOF
```

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

- **变量插值**：默认情况下，`heredoc` 会对内容中的变量进行插值（替换为变量的值）：

```bash
name="Alice"
cat <<EOF
你好，$name!
EOF
```

输出为：

```
你好，Alice!
```

- **禁止变量插值**：如果不希望对内容中的变量进行插值，可以使用单引号包围结束标识符：

```bash
cat <<'EOF'
你好，$name!
EOF
```

输出为：

```
你好，$name!
```

### 使用场景

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

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

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

 

图片from[西莉亞玩樂人生](https://www.facebook.com/ceciliafang1103?__cft__[0]=AZUj9xBkGYP__3glJe2Ray3QBqRyGjGgkwi-QFxbqljzgUQopydafQkPAIqsZf3_K8l6GoKeKp2-N_XumYkWHBoFHoTq2VuYpjc5rGuwwX3_4B9qAFLpZn_XmqUz_ib1zXMnSuF3qCjaOy1rRBm3Nmeu0o8oanjziVZMEJmjCIkMZTz8t8VcFgupQwXgN3NNb2OX-ssa5RnVeYePgHxFjYH17Ah_tXgiFvqmQOvQbfpjzw&__tn__=-UC*F)

