V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
jellyspot
V2EX  ›  程序员

shell 使用 EOF 解决交互输入时,如何在 EOF 中使用变量?

  •  
  •   jellyspot · 2022-03-09 17:48:15 +08:00 · 1872 次点击
    这是一个创建于 769 天前的主题,其中的信息可能已经有所发展或是发生改变。
    pwd="123456"
    
    passwd root <<EOF
    $pwd
    $pwd
    EOF
    

    我这样写,发现 EOF 中,不认我这个变量,想问下,这个在 shell 中应该怎么实现

    14 条回复    2022-03-10 12:42:12 +08:00
    hsfzxjy
        1
    hsfzxjy  
       2022-03-09 18:02:24 +08:00 via Android
    是可以的,有没什么报错
    jellyspot
        2
    jellyspot  
    OP
       2022-03-09 18:03:49 +08:00
    @hsfzxjy 执行的结果就是不会替换,$pwd 就是$pwd
    xuboying
        3
    xuboying  
       2022-03-09 18:04:59 +08:00
    这个东西叫“here doc”,搜一下就有详细教程了
    thedrwu
        4
    thedrwu  
       2022-03-09 18:05:26 +08:00 via Android
    认,但是 passwd 是否直接从 stdin 读或者读之前会不会 flush 又是另一个问题
    swulling
        5
    swulling  
       2022-03-09 18:06:42 +08:00
    $ cat i.sh
    #!/bin/bash
    pwd="123456"

    cat <<EOF
    a
    $pwd
    b
    c

    EOF

    $ bash ./i.sh
    a
    123456
    b
    c



    这不是正常替换了么
    swulling
        6
    swulling  
       2022-03-09 18:07:29 +08:00
    你这个问题是 passwd ,建议这么用
    echo "NEWPASSWORD" | passwd --stdin root

    passwd 支持从标准输入读取
    bufbz
        7
    bufbz  
       2022-03-09 18:11:44 +08:00
    cat > ~/.pip/pip.conf << 'EOF'
    [global]
    index-url = http://mirrors.aliyun.com/pypi/simple
    [install]
    trusted-host=mirrors.aliyun.com
    EOF


    EOF 加单引号即可。
    bufbz
        8
    bufbz  
       2022-03-09 18:13:12 +08:00
    看错了,这个是去变量,默认就是可以调用变量。
    hsfzxjy
        9
    hsfzxjy  
       2022-03-09 18:14:09 +08:00 via Android
    haoliang
        10
    haoliang  
       2022-03-09 19:18:19 +08:00
    `yes $pwd | passwd root`
    fuxkcsdn
        11
    fuxkcsdn  
       2022-03-09 23:16:05 +08:00
    #10 正解,一般需要输入密码的地方都是用 yes 命令
    iqfEmhuNidBhDfWo
        12
    iqfEmhuNidBhDfWo  
       2022-03-09 23:26:30 +08:00
    楼主这情景和我上一帖一样啊~
    ①heredoc 默认就是会解释变量的
    ②如果想不解释变量,可以在该字符串前加反斜杠转义,或者使用一对单引号闭合第一个 endpoint keyword (大家都习惯使用 EOF )
    ③回到楼主的操作上来,不管是"</path/to/file"表示标准输入重定向自文件,还是"<<keyword"表示标准输入重定向自 heredoc ,passwd 默认都不吃这一套,所以你需要加上楼上所说得--stdin 可选项
    ④另外顺便一说,楼主这需求也可以拿 expect 或者 socat 来实现
    mhycy
        13
    mhycy  
       2022-03-10 00:01:47 +08:00
    修改密码的操作有文档建议使用的命令是 chpasswd
    Alliot
        14
    Alliot  
       2022-03-10 12:42:12 +08:00
    passwd 有参数直接读取标准输入面交互 :
    ``` shell
    echo 'xxx' | passwd --stdin user
    ```
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   961 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 21:28 · PVG 05:28 · LAX 14:28 · JFK 17:28
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.