用户提示的Linux功能

时间:2018-10-08 19:57:57

标签: linux bash

我不明白为什么会得到这个输出

Delete content?  aas
Delete content?  a
Delete content?  s
Delete content?  n
ATS=Please enter Y or N.
Please enter Y or N.
Please enter Y or N.

使用以下脚本

#!/bin/bash

function prompt2() {
    while true; do
        read -p "$1 " answer
        case $answer in
            [Yy] ) answer=0; break;;
            [Nn] ) answer=1; break;;
            * ) echo "Please enter Y or N.";;
        esac
    done
    return $answer
}

a=$(prompt2 "Delete content? ")
echo "ATS=$a"

我希望输入错误的字符后,我会立即将"Please enter Y or N."行打印到屏幕上,但是只有在输入了预期的字符之一后,它才会被打印。提示函数返回的值也是意外的。


谢谢大家进行解释!对于我(习惯于OOP)而言,这种“工作流程”是新事物。

3 个答案:

答案 0 :(得分:3)

命令替换捕获功能的标准输出,而不是其返回代码。

简单的非侵入式修复是将函数内的return更改为echo,并将诊断消息更改为打印为标准错误(因此,请不要捕获“请回答Y或N“文字。

prompt2() {
    while true; do
        read -p "$1 " answer
        case $answer in
            [Yy] ) answer=0; break;;
            [Nn] ) answer=1; break;;
            * ) echo "Please enter Y or N." >&2;;
        esac
    done
    echo "$answer"
}

我也为您摆脱了笨拙的仅Bash的function关键字。

或者,不要更改功能,而是让调用代码检查返回代码。

if prompt2 "Delete things?"; then
    rm -rf /
else
    echo "Wise choice."
fi

答案 1 :(得分:1)

因为这不是$()在bash中的工作方式。

a=$(echo 'hi')
echo $a

即使echo正确完成,也将返回0。

返回码存储为$?

prompt2 "Delete content? "
echo "ATS=$?"

将给出您想要的答案

答案 2 :(得分:0)

您很近。正如@tripleee所说,命令替换正在捕获标准输出。因此,需要用回声代替返回值。

如果您想查看错误消息,请将其重定向到标准输出

echo "Please enter Y or N." >&2

希望这会有所帮助