Linux免交互及使用 Here Document 实现免交互



交互概念

交互指的是在程序运行过程中,用户可以通过发出指令控制程序的执行,而不是仅由程序单方面执行。例如,在多媒体播放时,用户可以暂停或调整音量。对于Linux操作系统,许多操作会涉及到交互,比如使用readftppasswdsusudofdisk等命令。

Linux中的免交互应用

为了实现自动化运维,Linux常常需要实现免交互操作,避免人工干预。例如,可以使用Here DocumentExpect等方法将命令提供给交互式程序,达到自动执行的效果。

免交互式操作(也称为非交互式操作)指在不需要用户干预的情况下,程序或脚本自动完成操作。这种方式广泛用于批量任务执行、自动化脚本和远程管理。实现免交互的常见方法有:

  1. Here Document
  2. Expect 脚本
  3. 重定向和管道
  4. 配置免密钥 SSH 登录

Here Document免交互

Here Document 是一种 I/O 重定向 技术,允许将一组命令或输入直接传递给一个程序,而无需创建临时文件。常用于向交互式命令提供输入。Here Document 使用 << 操作符。

基本语法

命令 <<标记
...
内容
...
标记

注意事项

  • 标记可以使用任意合法字符(通常为EOF);
  • 结尾的标记一定要顶格写,前面不能有任何字符;
  • 结尾的标记后面也不能有任何字符(包括空格);
  • 开头标记前后的空格会被省略掉。

示例

  1. 行数统计

    免交互方式实现对行数的统计,将要统计的内容置于标记“EOF”之间,直接将内容传给 wc -l 来统计

    wc -l <<EOF  # 以什么为标记,就以什么为结束
    Line1
    Line2
    EOF
    
  2. 读取输入

    通过 read 命令接收输入并打印,输入值是两个 EOF 标记之间的部分,作为变量 i 的值

    read i <<EOF
    Hi
    EOF
    echo $i
    
  3. 设置用户密码

    通过 passwd 给用户设置密码

    passwd lisi <<EOF
    abc1234  # 这两行是输入的密码和确认密码
    abc1234
    EOF
    
  4. 文件输出重定向

    通过cat实现查看和重定向输出到指定文件

    cat <<EOF >test.txt # 覆盖写入到文件
                       # 或cat >test.txt <<EOF
    hello world
    EOF
    #输出:
    hello world
    
  5. tee命令重定向输出加标准输出

    tee命令有标准输出的作用,可以直接重定向输入到文件中

    tee test2.txt <<EOF
    this is tee test
    EOF
    # 输出:
    this is tee test
    

功能配置示例

  1. 支持变量替换

    在写入文件时会先将变量替换成实际值,再结合 cat 命令完成写入

    #!/bin/bash
    file="test1.txt"
    i="school"
    cat > $file <<EOF
    I am going to $i
    EOF
    
  2. 整体赋值给变量再打印变量值

    整体赋值给变量,然后通过 echo 命令将变量值打印出来

    #!/bin/bash
    var="Great! I am going to school!"
    myvar=$(cat <<EOF			 
    This is Line 1.
    Today is Monday.
    $var
    EOF
    )
    
    echo "$myvar"
    # 输出:
    This is Line 1.
    Today is Monday.
    Great! I am going to school!
    
  3. 关闭变量替换,输出原字符

    关闭变量替换的功能,按照字符原本的样子输出,不做任何修改或替换

    #!/bin/bash
    var="Great! I am going to school!"
    myvar=$(cat <<'EOF'	# 对标记加单引号,即关闭变量替换
    This is Line 1.
    Today is Monday.
    $var
    EOF
    )
    
    echo $myvar       # 最后一行直接输出成$var
    # 输出:
    This is Line 1. Today is Monday. $var
    
  4. 去掉每行之前的 TAB 字符

    在标记前加“-”,即可抑制各行首TAB,用空格无效

    #!/bin/bash
    cat <<-'EOF'
                    tab27
       tab28
    EOF
    # 输出:
     tab27
     tab28
    
  5. 多行注释

    Bash 的默认注释是“#”,该注释方法只支持单行注释;

    Here Document 的引入解决了多行注释的问题。

    “:”代表什么都不做的空命令。中间标记区域的内容不会被执行,会被 bash 忽略掉,因此可达到批量注释的效果。

    #!/bin/bash
    var="Great! I am going to school!"
    : <<EOF    # 多行注释,
               # “:”开头的 Here Document 标记
               # 内容不会被执行
    This is Line 1.
    Today is Monday.
    $var
    EOF
    echo "$var" # $var为什么还能打印,已经定义了。
    # 没有了前两行正常的输出,有$var的输出,因为var已经定义了。
    # 输出:
    Great! I am going to school!
    

    简化后:

    : <<EOF
    a
    b
    c
    EOF
    # 输出没有任何结果,了解即可,还是用'#'注释直观
    

  • 39
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值