【问题标题】:How to use the read command in Bash?如何在 Bash 中使用读取命令?
【发布时间】:2011-12-02 07:50:37
【问题描述】:

当我尝试像这样在 Bash 中使用 read 命令时:

echo hello | read str
echo $str

没有回显,而我认为str 应该包含字符串hello。有人可以帮我理解这种行为吗?

【问题讨论】:

标签: bash built-in


【解决方案1】:

脚本命令中的read 很好。但是,您在管道中执行它,这意味着它位于子 shell 中,因此,它读取的变量在父 shell 中不可见。你可以

  • 将脚本的其余部分也移动到子shell中:

    echo hello | { read str
      echo $str
    }
    
  • 或使用命令替换从子shell中获取变量的值

    str=$(echo hello)
    echo $str
    

    或者稍微复杂一点的例子(抓取ls的第二个元素)

    str=$(ls | { read a; read a; echo $a; })
    echo $str
    

【讨论】:

  • 很棒的例子!我确实必须在 OSX 上稍微调整一下,方法是在花括号内放置空格,并在 echo 后面加一个分号,如下所示:str=$(ls | { read a; read a; echo $a; })跨度>
  • @javadba:不需要两次。给定的示例返回来自lssecond 项。使用单个read a,您将获得第一项。不要问我为什么回答者选择了这个例子。
  • 要将三个(或更多)IFS 分隔的列读取到变量中,可以执行“读取 VAR_1 VAR_2 VAR_3”。
  • 一直咬我。应该记录在手册页中..
【解决方案2】:

该值消失,因为读取命令在单独的子 shell 中运行:Bash FAQ 24

【讨论】:

    【解决方案3】:

    你需要管道吗?

    echo -ne "$MENU"
    read NUMBER
    

    【讨论】:

    • -1:您的echoread 命令没有以任何方式连接。
    • 发帖人显然想要一种自动填充变量而无需手动输入的方式。
    【解决方案4】:

    其他不涉及子外壳的 bash 替代方案:

    read str <<END             # here-doc
    hello
    END
    
    read str <<< "hello"       # here-string
    
    read str < <(echo hello)   # process substitution
    

    【讨论】:

    • 您也可以对此处的字符串使用进程,例如read A B C &lt;&lt;&lt; $(echo 'aaa bbb ccc')
    【解决方案5】:

    典型用法可能如下所示:

    i=0
    echo -e "hello1\nhello2\nhello3" | while read str ; do
        echo "$((++i)): $str"
    done
    

    和输出

    1: hello1
    2: hello2
    3: hello3
    

    【讨论】:

      【解决方案6】:

      把我的两分钱放在这里:在 KSH 上,reading 对变量起作用,因为根据the IBM AIX documentation,KSH 的read 确实 影响当前的shell环境:

      read命令设置shell变量会影响当前shell执行环境。

      这只是让我花了几分钟时间弄清楚为什么我之前在 AIX 上使用过无数次的以 read 结尾的单行代码在 Linux 上不起作用...这是因为 KSH 确实可以节省到当前环境,而 BASH 没有!

      【讨论】:

        【解决方案7】:

        另一种选择是使用 printf 函数。

        printf -v str 'hello'
        

        此外,这种结构结合在适当情况下使用单引号有助于避免子shell 和其他形式的插值引用的多重转义问题。

        【讨论】:

        • 如果这就是您想要实现的全部目标,您不妨这样做str='hello。我认为这里的重点是将命令的输出捕获到变量中。
        【解决方案8】:

        我真的只使用带有“while”和do循环的read:

        echo "This is NOT a test." | while read -r a b c theRest; do  
        echo "$a" "$b" "$theRest"; done  
        

        这是一个测试。
        对于它的价值,我已经看到了在 bash 中始终将 -r 与 read 命令一起使用的建议。

        【讨论】:

          【解决方案9】:

          你不需要 echo 来使用 read

           read -p "Guess a Number" NUMBER
          

          【讨论】:

            猜你喜欢
            • 2017-08-12
            • 2017-04-11
            • 2023-01-31
            • 1970-01-01
            • 2020-02-02
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2020-10-13
            相关资源
            最近更新 更多