否则,函数shell脚本放在函数中时行为异常

否则,函数shell脚本放在函数中时行为异常,shell,zsh,Shell,Zsh,为了学习,我尝试修改一个shell脚本,该脚本将workspace作为参数,如果没有给出参数,则提示用户。 我想到了这个: getWorkspaceFromUser() { while true; do read -e -p "Is current directory your workspace? (y/n): " input_yn case $input_yn in [Yy]* ) workspa

为了学习,我尝试修改一个shell脚本,该脚本将workspace作为参数,如果没有给出参数,则提示用户。 我想到了这个:

getWorkspaceFromUser() {
    while true; do
        read -e -p "Is current directory your workspace? (y/n): " input_yn
        case $input_yn in
            [Yy]* )
                workspace="."
                break
                ;;
            [Nn]* )
                while true; do
                    read -e -p "Please enter the path to your workspace (use tabs)? " input_ws
                    if [ -d $input_ws ]; then
                        workspace=$input_ws
                        break
                    fi
                    echo "Please enter a valid directory. "
                done
                break
                ;;
            * ) echo "Please answer yes or no."
                ;;
        esac
    done
    echo $workspace
}

# check if a valid workspace was provided. Otherwise, get it from user.
if [ $# -gt 0 ] && [ -d $1 ]; then
    workspace=$1
else
    workspace=$(getWorkspaceFromUser)
fi

#...... rest of the
#...... processing follows
如果我在第一个提示中输入了y/n以外的字符,或者在第二个提示中输入了无效路径,则可以看到异常行为。例如:

Is current directory your workspace? (y/n): k
Is current directory your workspace? (y/n): k
Is current directory your workspace? (y/n): k
Is current directory your workspace? (y/n): y
Please answer yes or no. Please answer yes or no. Please answer yes or no. .

Is current directory your workspace? (y/n): n
Please enter the path to your workspace (use tabs)? gggg
Please enter the path to your workspace (use tabs)? gggg
Please enter the path to your workspace (use tabs)? gggg
Please enter the path to your workspace (use tabs)? /home
Please enter a valid directory. Please enter a valid directory. Please enter a valid directory. /home

令人费解的是,如果我将getWorkspaceFromUser()的内容保存为shell脚本并运行它,它将按预期工作。有人知道这里发生了什么吗?谢谢。

您基本上都做到了:

echo "Please answer yes or no."
echo $workspace
并且假设bash将找出哪个是为用户准备的,哪个是为捕获准备的

相反,您应该将所有状态消息写入stderr:

echo >&2 "Please answer yes or no."
...
echo >&2 "Please enter a valid directory. "

这样,它们就会出现在屏幕上,而不是在您的
工作区中

发布的代码看起来像
bash
,而不是
zsh
。要在
zsh
中打印提示,请使用
read input\u yn?“当前目录是您的工作区吗?(y/n)”
-e
也有不同的含义,应该省略。