为什么在运行脚本时没有出现bash读取提示



我有一个bash脚本,它根据用户想要做的事情提示用户提供不同的信息。这些提示通常使用read -p完成。通常情况下,它工作得很好,用户看到了被问到的内容,输入了他们需要输入的内容,一切都做了它需要做的事情

请参阅脚本中函数的以下(经过净化的(片段:

#!/bin/bash
function_name() {
if [ "$this_value" == "default" ];then
echo "Value set to default."
read -p "Enter desired value here: " desired_value
desired_value=${desired_value^^}
if [ "${#desired_value}" != 3 ] ;then
echo "$desired_value is an invalid entry."
exit 1
fi
if [ "$desired_value" != "$(some command that returns something to compare against)" ];then
echo "$desired_value is an invalid entry."
exit 1
fi
read -p "You entered $desired_value. Is this correct? [y/N] " reply
reply=${reply,,}
case "$reply" in
y|yes)  
$some command that does what I want it to do
;;
*)
echo "User did not enter yes"
exit 1
;;
esac
fi
}

通常CCD_ 2和CCD_。但在我看到的一些例子中,由于某种原因,read提示只是空白。用户将看到以下内容:

./script.bash
##unrelated script stuff
##unrelated script stuff
Value set to default.
user_entered_value_here
User did not enter yes. Exiting.

这是刚刚发生的一个真实的例子,最终让我来到这里询问发生了什么(我进行了适当的修改,使其成为SO帖子(。

现在出现的是这两个空行,而不是read -p文本。对于第一个,用户输入user_entered_value_here,因为即使没有read提示,他们也已经知道应该在那里输入什么。第二个是Y/N提示,他们不知道,所以他们看到它显然挂起了,并点击Enter而不是y,导致它触发*case选项。

我不明白为什么read -p文本没有出现,尤其是为什么它出现在大多数用户身上,而不是所有用户身上。我怀疑是某种环境环境造成了这种情况,但就我的一生而言,我不知道是什么。这只在RHEL 6.2上运行,在bash 4.1.2下运行。

我查看了bash的负责人,了解了关于内置read的一些细节。指定CCD_ 11选项显示";在尝试读取任何输入之前,在标准错误上提示,不带换行符只有当输入来自终端时才显示提示";。

让我们考虑一下简单的脚本input.sh:

#!/bin/bash
read -p "Prompt : " value
echo The user entered:  "$value"

执行示例:

$ ./input.sh
Prompt : foo
The user entered: foo
  1. 如果stderr被重定向:
$ ./input.sh 2>/dev/null
foo
The user entered: foo
  1. 如果输入是管道
$ echo foo | ./input.sh
The user entered: foo
  1. 如果输入是heredoc
$ ./input.sh <<EOF
> foo
> EOF
The user entered: foo

使用shell不可知语法重新编写脚本,并修复了一些错误,如使用字符串比较器!==而不是数字比较器-ne-eq:比较字符串长度

#!/usr/bin/env sh
this_value=default
toupper() {
echo "$1" | tr '[:lower:]' '[:upper:]'
}
function_name() {
if [ "$this_value" = "default" ]; then
echo "Value set to default."
printf "Enter desired value here: "
read -r desired_value
desired_value=$(toupper "$desired_value")
if [ "${#desired_value}" -ne 3 ]; then
printf '%s is an invalid entry.n' "$desired_value"
exit 1
fi
if [ "$desired_value" != "$(
echo ABC
: some command that returns something to compare against
)" ]; then
echo "$desired_value is an invalid entry."
exit 1
fi
printf 'You entered %s. Is this correct? [y/N] ' "$desired_value"
read -r reply
reply=$(toupper "$reply")
case $reply in
'y' | 'yes')
: "Some command that does what I want it to do"
;;
*)
echo "User did not enter yes"
exit 1
;;
esac
fi
}
function_name

相关内容

  • 没有找到相关文章

最新更新