如何使KSH函数只返回一些回显消息

时间:2016-04-16 05:12:23

标签: shell unix stdout ksh

假设我有一个KSH函数返回其参数的总和,但是如果没有提供参数,它会提示用户输入:

#!/bin/ksh
sum() {
  typeset v1=$1
  typeset v2=$2

  test -z "$v1" && { printf "please enter v1: "; read v1; }
  test -z "$v2" && { printf "please enter v2: "; read v2; }

  echo $((v1+v2))
}

我想将此函数的结果赋给变量,通常我会这样做

typeset result=`sum 3 4`
echo $result # 7

但是当我使用提示版

typeset result=`sum`
echo $result

它有2个不受欢迎的效果:首先不显示提示消息please enter ...,其次,result将包含文本please enter ...而不仅仅是数字。

$ typeset result=`sum`
$ 1
$ 2
$ echo $result
please enter v1: please enter v2: 3

如何编辑函数sum,这样当没有提供参数时,它会将提示消息please enter ...打印到stdout而不是返回result变量?< /强>

1 个答案:

答案 0 :(得分:1)

首先,我必须表示在这样的函数中间提示输入是一个可怕的想法。但是,如果您要这样做,您可以将提示打印到stderr或/ dev / tty

sum() {
  typeset v1=$1
  typeset v2=$2

  test -z "$v1" && { printf "please enter v1: " >&2; read v1; }
  test -z "$v2" && { printf "please enter v2: " > /dev/tty; read v2; }

  echo $((v1+v2))
}

或者,使用read -p读取打印提示给stderr。 (即test -z "$v1" && read -p "Please enter v1: " v1