окружите функцию для запроса и вход возврата

Я пытаюсь записать функцию помощника для использования в сценарии удара, чтобы взять переменную строку приглашения и возвратить значение вводы данных пользователем. То, что я имею, сидит и ждет пользователя для ввода значения, не отображая подсказку сначала, которая является озадачивающей. Это также хранит эхо в возвращаемом значении ($foo) и не удерживает чтение значения с изодромной с предварением переменной.

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

foo=$(promptValue "type something")

Править: Для любого, кто мог бы хотеть использовать это в будущем для их собственного использования, это - полный (функциональный) сценарий, который разработан для отправки электронного письма (в этом случае к моему сотовому телефону) для сообщения мне, когда длительный процесс завершается. Я уверен, что должен быть лучший способ сделать это, но meh. :-) (я записал им как это, чтобы использоваться в библиотеке функций удара в другом месте.)

#!/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

Еще раз спасибо все!

5
задан Jens 19 May 2012 в 18:15
поделиться

3 ответа

[

]Значения выхода функции совпадают со значениями последней команды, выполненной внутри функции, или со значением, указанным в заявлении []return n[], где []n[] находится в диапазоне 0-255. Если вы хотите, чтобы функция возвращала строковое или числовое значение, используйте []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]
]
4
ответ дан 14 December 2019 в 13:38
поделиться

очевидно, что это сработает, если вы выполните напрямую, а не назначите ее foo. Если Вы пытаетесь захватить значение val, то почему noit просто делает:

promptValue "type something"
foo=$pid
0
ответ дан 14 December 2019 в 13:38
поделиться

Казалось бы, обычный способ -

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

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

$(...), "подстановка команд", в результате принимает стандартный вывод "команды" (поэтому на вашем терминале не отображается echo и т.д.).

2
ответ дан 14 December 2019 в 13:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: