linux Here文档 EOF 执行多行命令代码

100 阅读1分钟

在这个代码片段里,`<<EOF` 属于Bash(或其他类Unix shell)中的Here文档(Here document)语法。下面为你详细解释其用途和工作原理。

mysql -u root -p << EOF
USE testdb;
CREATE TABLE users (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(50),
    age INT
);
INSERT INTO users (name, age) VALUES ('张三', 25);
SELECT * FROM users;
EOF

### Here文档的用途

Here文档主要用于将一段文本输入到命令里,这些文本可包含多行内容,并且在文档中能使用变量展开、命令替换等功能。一般在向交互式命令传递大量输入内容时会用到它。

### Here文档的语法

Here文档的基本语法如下:

```bash

command << delimiter

document

delimiter

```

- `command`:这是要执行的命令。

- `delimiter`:为自定义的分隔符,通常使用 `EOF`(End Of File的缩写),不过也可以用其他字符串,像 `END`、`MARKER` 等。

- `document`:指的是要传递给命令的文本内容。

### 代码示例解释

在你给出的代码中:

```bash

mongo --host HOSTportHOST --port PORT --quiet $DB_NAME <<EOF

// 获取所有以head_shoulder_开头的集合

var targetCollections = db.getCollectionNames().filter(function(name) {

return name.startsWith("head_shoulder_");

});

EOF

```

- `mongo --host HOSTportHOST --port PORT --quiet DB\_NAME\`:这是要执行的命令,也就是启动MongoDB客户端,连接到指定的主机(\`HOST`)和端口(`PORT\`),并选择数据库(\`DB_NAME`),同时以安静模式运行。

- `<<EOF`:表明开始一个Here文档。

- `EOF` 之前的内容:是传递给 `mongo` 命令的JavaScript代码,其作用是获取所有以 `head_shoulder_` 开头的集合名称。

- `EOF`:代表Here文档结束。

### 变量展开和命令替换

Here文档里可以进行变量展开和命令替换。例如:

```bash

echo "My name is $USER" <<EOF

I am using $(uname) operating system.

EOF

```

在这个例子中,`USER\` 会被替换成当前用户的名称,\`(uname)` 会被替换成当前操作系统的名称。

### 避免变量展开

若你不想让Here文档中的变量展开,可以使用单引号将分隔符括起来,例如:

```bash

echo "My name is $USER" <<'EOF'

I am using $(uname) operating system.

EOF

```

这样一来,`USER\` 和 \`(uname)` 就不会被替换,而是作为普通文本输出。

例子

(base) [root]# sort << eof

> a

> c

> e

> q

> m

> eof

a

c

e

m

q

(base) [root]#