bash:防止重定向函数的错误与输出混合

时间:2014-08-13 15:24:42

标签: bash

想要从某个功能获取用户的输入。但是,提示符("请回答y或n。"在这种情况下)也包含在返回值中。

#!/bin/bash

input() {
    while true; do
        read -p "input y/n: " yn
        case $yn in
            [Yy]* ) yn="y"; break;;
            [Nn]* ) yn="n"; break;;
            * ) echo "Please answer y or n.";;
        esac
    done

    echo $yn
}

val=$(input)
echo "val is: $val"

如果首先输入错误值,结果如下:

input y/n: other
input y/n: y
val is: Please answer y or n.
y

感谢。

2 个答案:

答案 0 :(得分:5)

将您的错误回应到stderr(FD 2),而不是stdout(默认值,FD 1):

echo "Please answer y or n." >&2

答案 1 :(得分:3)

最好使用公共全局变量在函数和调用者之间传递值。它比使用命令替换召唤子shell更有效。

#!/bin/bash

input() {
    while true; do
        read -p "input y/n: " __
        case "$__" in
            [Yy]* ) __="y"; break;;
            [Nn]* ) __="n"; break;;
            * ) echo "Please answer y or n.";;
        esac
    done
}

input; val=$__
echo "val is: $val"