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

bash:防止重定向函数';将错误与输出混合,bash,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

希望从函数中获取用户的输入。但是,返回值中也包含提示(“在本例中,请回答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
谢谢。

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


最好使用公共全局变量在函数和调用方之间传递值。这比用命令替换召唤次地狱更有效

#!/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"

就效率达成一致。但是,如果有多个函数或嵌套函数执行共享变量,那么使用共享变量可能会很有趣;采用这种方法时,我倾向于将变量名作为第一个参数传递。从
bash
4.3开始,您可以使用命名引用来简化此过程。在函数开头添加
declare-n\uu=$1
,然后调用
input val
input
返回后,
val
将包含答案。(4.3于2014年2月发布;截至2014年8月,我不确定它的应用范围有多广。)…对于不太流行的bash版本,我倾向于使用类似于
printf-v“$1”'%s''$\uu”
的东西将值复制到命名变量中,但是@chepner的方法绝对是正确的。@chepner我对
-n
感到非常高兴,因为我在4.3发布之前就知道了这个特性。这是一个很好的选择,可以替代我提出的、但被拒绝的、我称之为
setvalue
的一般赋值。但是4.3在发布之前做了一些修改,使我的应用程序瘫痪。它只是没有让我有兴趣支持新功能:)@CharlesDuffy我曾经向你和mklement0提到过这个功能。
#!/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"