用于提示和返回输入的shell函数

用于提示和返回输入的shell函数,shell,scripting,user-input,Shell,Scripting,User Input,我正在尝试编写一个helper函数,用于bash脚本中获取一个变量提示字符串并返回用户输入的值。我所做的只是等待用户输入值而不首先显示提示,这令人费解。它还将echo存储在返回值($foo)中,并且不保留与pid变量一起读取的值 !#/bin/bash pid=0 promptValue() { msg="$1" echo -e "$msg" read val pid=$val } foo=$(promptValue "type something") 编辑: 对于将来可能想

我正在尝试编写一个helper函数,用于bash脚本中获取一个变量提示字符串并返回用户输入的值。我所做的只是等待用户输入值而不首先显示提示,这令人费解。它还将echo存储在返回值($foo)中,并且不保留与pid变量一起读取的值

!#/bin/bash
pid=0
promptValue() {
  msg="$1"
  echo -e "$msg"
  read val
  pid=$val
}

foo=$(promptValue "type something")
编辑: 对于将来可能想使用此功能的人,这是一个完整的(功能性)脚本,用于发送电子邮件(在本例中是发送到我的手机),让我知道长时间运行的过程何时完成。我相信一定有更好的办法,但我想:-)(我这样编写它们是为了在其他地方的bash函数库中使用。)


再次感谢大家

显然,如果您直接执行,而不是将其分配给foo,这将起作用。如果您试图获取val的价值,那么为什么不这样做:

promptValue "type something"
foo=$pid

通常的做法是:

#!/bin/bash
pid=0
promptValue() {
  read -p "$1"": " val
  pid=$val
}

promptValue "type something"
echo 'pid:'$pid'!'

$(…)
,“命令替换”将“命令”的标准输出作为结果(因此它不会在您的终端上显示
回声,等等)。如果希望函数返回字符串或数值,可以使用
echo
。如果您希望捕获变量中函数的输出,并且仍然能够向用户发送输出而无需捕获该输出,请使用
stderr
,这正是
read-p
所做的

$ demo() {
    local num
    echo "capture this"
    echo "Message to user" >&2
    read -p $1 num
    echo $(( num * 2 ))
    return 42
}
$ result=$(demo "Enter a number: ")
Message to user
Enter a number: 12
$ echo $?
42
$ echo "$result"
capture this
24
$ echo "$num"
[null][newline]

我最终使用了这个答案和上面Alex的答案的组合。谢谢大家!您可以在ps…时执行
。。。;执行
,这样就不需要重复了。您可以执行
read-p“$1:”val
,而无需额外的引号。您应该缩小
ps
grep
,以减少误报:
ps-ef-o pid=
(这也可以消除
grep-v
)。您可以使用
grep-q
来避免重定向。如果你想避免被甩出,你的提示/输入可以在
中,而
循环中。实际上,我应该说
ps-eo-pid=
不需要额外的引号:
read-p“$1:
echo”pid:$pid!”
(虽然在提示下,如果在双引号中出现多余的感叹号,将导致历史记录“event not found error”。在脚本中,这不会是问题。
$ demo() {
    local num
    echo "capture this"
    echo "Message to user" >&2
    read -p $1 num
    echo $(( num * 2 ))
    return 42
}
$ result=$(demo "Enter a number: ")
Message to user
Enter a number: 12
$ echo $?
42
$ echo "$result"
capture this
24
$ echo "$num"
[null][newline]