shell函数提示输入并返回

时间:2010-01-01 19:55:58

标签: shell scripting user-input

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

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

foo=$(promptValue "type something")

修改 对于任何可能希望将来使用它以供自己使用的人,这是完整的(功能)脚本,旨在发送电子邮件(在本例中为我的手机),让我知道长时间运行的过程何时完成。我确信必须有更好的方法来做到这一点,但是,好吧。 :-)(我把它们写成这样,用于其他地方的bash函数库。)

#!/bin/bash

promptValue() {
 read -p "$1"": " val
 echo $val
}

alertme() {
 if [ -z "$email" ]; then
   email=$(promptValue "Enter email")
 fi

 if [ -z "$email" ]; then 
   echo "ERROR: No email set!"
   exit 1
 fi

 if [ -z "$pid" ]; then
   pid=$(promptValue "Enter pid")
 fi

 if [ -z "$pid" ]; then 
   echo "ERROR: No pid set!"
   exit 1
 fi

 ps -ef | grep $pid | grep -v grep > /dev/null 2>&1
 while [ $? eq 0 ]; do
  sleep 10
  ps -ef | grep $pid | grep -v grep > /dev/null 2>&1
 done

 echo "Process Complete" | mailx -s "Process Complete" $email
}

alertme

再次感谢大家!

3 个答案:

答案 0 :(得分:4)

函数的退出值与函数内执行的最后一个命令的退出值相同,或return n语句提供的值n在0-255范围内。如果希望函数返回字符串或数值,则使用echo。如果您想在变量中捕获函数的输出并且仍然能够在没有捕获的情况下将输出发送给用户,请使用stderr这就是read -p。{/ 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]

答案 1 :(得分:2)

正常的做法似乎是:

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

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

$(...),“命令替换”,将“命令”的标准输出作为结果(因此它不会显示终端上的echo等)。

答案 2 :(得分:0)

显然,如果直接执行而不是将其分配给foo,这将有效。如果你试图捕获val的值,那么为什么只是这样做:

promptValue "type something"
foo=$pid