我有这个脚本:
function input_message {
echo -e "$1: "
while read -r response; do
case $response in
"")
return 1
;;
*)
echo $response
;;
esac
break
done
}
我正在尝试在另一个脚本中执行以下操作:
INPUTVAR="$(input_message 'Input a value')"
但是,运行它时控制台窗口上发生的情况如下:
nick@laptop:~$ INPUTVAR="$(input_message 'Input a value')"
This is my input
Input a value: This is my input
当然,我希望这个功能可以做到这一点:
nick@laptop:~$ INPUTVAR="$(input_message 'Input a value')"
Input a value: This is my input
This is my input
实现这一目标的正确方法是什么?我尝试了各种类型的命令扩展技术,似乎无法做到正确:(
答案 0 :(得分:1)
函数声明中缺少{
。
函数中的echo
会将reponse
变量的值写入标准输出。
INPUTVAR=$(...)
捕获在(...)
之间执行的命令的标准输出,并将这些输出分配给INPUTVAR
。这就是为什么在控制台中看不到任何内容。
当我测试该功能时,我得到的结果与你不一样。
read
有一个-p
选项,用于显示标准错误的提示,当标准错误未重定向到其他位置时,该提示将显示在控制台中。
试一试,打印到控制台并为INPUTVAR
分配值:
$ cat fnlib.sh
function input_message() {
while read -r -p "${1}: " response; do
case $response in
"")
return 1
;;
*)
printf "%s" "${response}"
printf "%s\n" "${response}" >&2
;;
esac
break
done
}
$ . fnlib.sh
$ INPUTVAR="$(input_message 'Input a value')"
Input a value: This is my input
This is my input
没有提供任何价值的第二次测试:
$ INPUTVAR="$(input_message 'Input a value')"
Input a value:
如果用户未输入任何内容并按[ENTER]
键,则该功能不会向标准输入打印任何内容,因此INPUTVAR
变量将被分配空字符串。
答案 1 :(得分:0)
使用echo
打印提示会使提示成为命令替换结果的一部分。如果您使用read -p
代替(但这是一种咒语),或者将提示写入标准错误,您将获得预期的结果。
value=$(printf "Read a value: " >&2; read -r input; echo "$input")
或
value=$(read -p "Read a value: " -r input; echo "$input")
注意如何取消设置$input
,因为命令替换在子shell中运行。诀窍是不要在$value
中打印到标准输出中的任何内容。
当然,使用
可以轻松实现这一目标read -p "Read a value:" value