我该如何使用"阅读"在bash命令替换中替换用户输入?

时间:2018-01-23 17:35:27

标签: bash shell

试图像这样做一个快速而肮脏的卷曲调用:

curl -u username:$(read -s -p "password: ") https://some.basic.auth.url.com

但是,每次都失败了。更重要的是,我试图通过以下方式了解发生了什么:

echo you entered: $(read -p "enter some text: ")

然而,输出只是:

you entered:

我明显遗漏了使用此命令所必需的一些内容(或一般的Bash)。有人可以说清楚:

  1. 这种事情能发挥作用吗?为什么呢?
  2. 如果是这样,我怎么能更改它以使其工作而无需转到脚本文件

2 个答案:

答案 0 :(得分:5)

echo "You entered: $(IFS= read -rp "Enter some text: "; printf '%s' "$REPLY")"

来自help read

  

read ... [name ...]

     

从标准输入读取一行...该行与单词一样被分割为字段   拆分,第一个单词分配给第一个NAME,第二个单词   单词到第二个NAME,依此类推,分配给任何剩余的单词   最后NAME。只有$IFS中找到的字符才会被识别为单词   分隔符。

     

如果未提供NAMEs,则读取的行将存储在REPLY变量中。

  • IFS= ...:不修剪前导和尾随空格
  • -r:不要破坏反斜杠
  • echo "$REPLY":如果您不提供任何NAME,则读取的行将存储在$REPLY变量中。但是,read不打印它,因此命令替换扩展为空。因此,您必须使用例如printf
  • 明确打印它

请注意,如果您在read内使用$(...),则一旦您离开替换,该变量就会丢失。更好的方法:

IFS= read -rp "Enter some text: " var
echo "You entered: $var"

答案 1 :(得分:1)

read部分可以放在bash函数中,并带有局部变量,这样可以使代码更清晰:

password(){ local password; read -s -p "password: " password; echo "${password}"; }

用法:

curl -u username:"$(password)" https://some.basic.auth.url.com