文章目录如下
????????
? ? EOF?是一种特殊的输入重定向操作符。它的作用是在命令行中指定一个多行输入,并将其作为标准输入传递给命令。在编写 shell 脚本时,经常用来在命令行中提供多行输入,尤其常用于需要交互式输入的场景,例如交互输入 root 密码。
????????
基本格式如下:
命令 <<EOF
交互命令1
交互命令2
EOF
在任意一个命令后方加入 <<EOF,在下一行编写需要交互的命令,最后以 EOF 结尾。
????????
这个 EOF 命令不是固定的,可以是任意字符,但结尾字符必须与开始字符一致。
命令 <<ABC
交互命令1
交互命令2
ABC
????????
注意:结尾字符前面不能包含空格,如果包含空格就会出现这种异常
cat <<EOF
第1行字符串~
第1行字符串~
EOF # 前面有一个空格
????????
在大部分情况下,我们语法需要缩进时,如果还将 EOF 中的命令和结尾的 EOF 贴着左边写,那么整体代码会显得非常难看,这时候就需要在开始 EOF 前加上一个符号 -
<<-EOF
cat <<-EOF
1行字符串~ # 使用缩进
2行字符串~ # 使用缩进
EOF # 使用缩进
加上 - 符号后,不论是中间的字符串还是结尾的 EOF 都可以使用缩进(不限于1个缩进)
????????
【示例】封装一个函数,对某个文件追加内容
# 定义一个函数
function AdditionalInformation(){
cat <<-EOF >>file.txt # 将内容追加到文件
1行字符串~
2行字符串~
EOF
}
AdditionalInformation
使用 -EOF 后,缩进会被忽略
????????
比如在编写脚本时,需要注明该脚本的作者、时间、作用等多行信息时,可以使用 EOF 实现
#!/bin/bash
<<COMMENT
Author: yt
Start time: 2024-01-01
Version num: 1.0
Script use: xxx
COMMENT
echo "这是一个脚本"
????????
我们知道清理缓存需要 root 权限,普通用户想要清理缓存必须先 su root 才能实现。在 shell 中,我们也可以利用 EOF 来实现。
# root密码
root_pwd='123456'
# 定义一个清理缓存的方法
function ClearCache(){
su root <<-EOF
${root_pwd}
echo 3 > /proc/sys/vm/drop_caches
echo "清理缓存成功!"
EOF
}
ClearCache
信息前面弹出了一个 "密码" 的字样,意思就是 su root 需要手动输入密码。使用 EOF 后将自动输入密码,而后再依次执行后面的命令。
????????
当然了,我们还可以通过 EOF 检查密码
# root密码
root_pwd='123456'
# 定义一个检查root密码的方法
function CheckRootPassword(){
# 输入root密码
su root <<-EOF
${root_pwd}
EOF
# 判断是否执行成功
if [ $? -eq 0 ];then
echo -e "\n[INFO] 密码正确"
else
echo -e "\n[ERROR] 密码错误"
fi
}
CheckRootPassword
????????
EOF 可以实现本机的交互,我试了 ssh 执行命令却不行,ssh 还得免密之后才能交互命令。