试图像这样做一个快速而肮脏的卷曲调用:
curl -u username:$(read -s -p "password: ") https://some.basic.auth.url.com
但是,每次都失败了。更重要的是,我试图通过以下方式了解发生了什么:
echo you entered: $(read -p "enter some text: ")
然而,输出只是:
you entered:
我明显遗漏了使用此命令所必需的一些内容(或一般的Bash)。有人可以说清楚:
答案 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