选择命令显示选项而不显示问题。做出选择后显示问题。
我在脚本中有一个如下所示的函数。
function start_AppNode
{
# Define local variables for all the inputs
local DName_l=$1
local ASName_l=$2
local ANName_l=$3
echo "Do you wish to start the AppNode $ANName_l on AppSpace $ASName_l in Domain $DName_l ?"
select yn in "Yes" "No"; do
case $yn in
Yes )
#print_log $yn
OUTPUT="`./appadmin start -d $DName_l -as $ASName_l anode $ANName_l`"
if [[ "$OUTPUT" == *"$SuccessMessage_AppNode_Start"* ]]; then
echo "Started"
else
echo "Failed"
fi
break;;
No ) echo "Failed"; break;;
esac
done
}
当我在导入此脚本的其他脚本中调用该脚本时,我首先获得选项而不显示问题“ Do you wish to start the AppNode $ANName_l on AppSpace $ASName_l in Domain $DName_l ?
”
它显示了做出选择后的问题。请参阅下面的输出屏幕截图。感谢是否有人可以帮助我理解如何让它首先显示问题?
更新:问题是由于变量分配。我将函数的输出分配给一个变量。如果我在没有将返回值分配给变量的情况下执行该函数,它就可以工作。如何将返回值分配给变量并且仍然在选项之前显示问题部分?
我将忽略代码不会生成您展示的输出这一事实,而是专注于如何与用户交互。
该
select
语句在标准错误流上显示菜单和提示。习惯上在此流上与用户交互,不要使用户交互成为程序标准输出流的一部分(这可能会混淆下游进程从函数读取输出)。我建议您在标准错误流而不是标准输出流上将问题输出给用户。这是有道理的,因为您的问题与用户交互有关。
在某些情况下,标准输出和标准错误流可能会在终端中交错出现。使用单个流与用户交互可以避免这种情况。
我还建议您使用
printf
而不是echo
在必须输出变量数据时立即使用:如果您希望函数提供可以在脚本的某些主要部分中使用的退出状态:
然后,稍后:
该
if
语句读取并作用于函数的退出状态。函数的退出状态是函数中执行的最后一条语句的退出状态。这将是grep -q
电话。如果在语句的输出中找到任何字符串,则为真(零),如果未找到该字符串,则为假(非零)。该语句有条件地输出 的输出,或者根本不输出,这取决于用户做出的选择、给函数的参数以及影响 输出的任何其他数量的外部因素。$SuccessMessage_AppNode_Start
select
select
./appadmin
./appadmin
正如@icarus在评论中所写:
您需要确保
echo
没有缓冲。您可以运行您的echo
withstdbuf -o0
orunbuffer
以确保将问题打印到 STDOUT 而没有任何缓冲。