shell中如果定义多行的字符串可以使用heredoc
先检查一下当前使用shell
echo $0
-bash
heredoc
是一种在 Shell 脚本、编程语言(例如 Bash、PHP、Ruby 等)中,用来定义多行字符串的方法。它可以使代码中的字符串定义更加清晰和可读,尤其适用于需要定义包含多行内容的文本块时。以下是 heredoc
的基本用法和一些示例。
Bash 中的 Heredoc 语法
在 Bash 中,heredoc
的语法如下:
command <<EOF
内容...
EOF
command
表示你要将这些多行内容传递给的命令,例如cat
、echo
等。<<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!
使用场景
- 输出多行提示信息:可以用于脚本中输出多行提示信息,提高可读性。
- 生成配置文件:可以方便地生成配置文件的内容。
- 处理多行文本输入:适用于将多行文本传递给命令或函数。
heredoc
提供了一种灵活和直观的方式来处理多行文本,使得代码更加易读。
bash, zsh heredoc使用放到相同csh,tcsh对heredoc支持有限
图片from西莉亞玩樂人生
Comments are closed.