`read`输出到变量不会回显到控制台窗口

时间:2016-05-31 10:23:25

标签: bash shell

我有这个脚本:

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

实现这一目标的正确方法是什么?我尝试了各种类型的命令扩展技术,似乎无法做到正确:(

2 个答案:

答案 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