如何使用 "read" 在 bash 命令替换中替换用户输入?



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

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. 如果是这样,我如何更改它以使它在不转到脚本文件的情况下工作?
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"

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

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

用法:

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

我不明白简单地进行读取&&echo组合会有什么问题?我希望使用读取命令输出作为替代品,因此搜索将我带到这里。 我很快就想出了一些对我有用的东西,我认为没有理由它不适用于 op。我需要使用 ipmitool 读取用户输入指示的传感器来快速输出 bmc 传感器。我知道我不能按原样使用读取,但不确定然后意识到我可以这样做:

[root@localhost ~]# printf "%dn" "0x$(ipmitool raw 0x4 0x2d 0x$(read -p 'id: ' r && echo ${r:-00})|awk '{print $1}')"
id: 
0
[root@localhost ~]# printf "%dn" "0x$(ipmitool raw 0x4 0x2d 0x$(read -p 'id: ' r && echo ${r:-00})|awk '{print $1}')"
id: 0f
73

注意使用 ${var:-default*},以便没有输入默认值 00。 我们感兴趣的命令输出是第二个十六进制字段,需要转换。 好吧,我的意思是它实际上不需要,但每个人都有自己的哈哈。我不是任何方面的专家,但我看不到这种突破,除了纯粹的posix。

**ipmitool 的原始代码并非特定于我所知道的任何平台。实际上,我 https://github.com/erik-smit/oohhh-what-does-this-ipmi-doooo-no-deedee-no/blob/master/1-discovering/snippets/Computercheese/IPMI-Sensor%20Device%20Commands.txt 在这里学习了它们,并且还有许多其他非常有用的文档,不仅针对ipmitool,还针对其他各种ipmi接口。

最新更新