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

How to make KSH function return only some echo message

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

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

  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 ... 打印到标准输出而不是 return result 变量?

首先,我必须说明,在这样的函数中间提示输入是一个糟糕的主意。但是如果你打算这样做,你可以将提示打印到 stderr 或 /dev/tty

sum() {
  typeset v1=
  typeset v2=

  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