функция оболочки для запроса и возврата ввода

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

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

foo=$(promptValue "type something")

EDIT: Для тех, кто захочет использовать это в будущем для собственного использования, это полный (функциональный) скрипт, предназначенный для отправки электронного письма (в данном случае на мой мобильный телефон) на дайте мне знать, когда завершится длительный процесс. Я уверен, что должен быть лучший способ сделать это, но мех. :-) (Я написал их так, чтобы использовать их в библиотеке функций 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

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


person Almo    schedule 01.01.2010    source источник
comment
Вы можете сделать while ps...; do, чтобы вам не нужно было повторять это. Вы можете сделать read -p "$1: " val без дополнительных кавычек. Вы должны сузить grep из ps, чтобы уменьшить ложноотрицательные результаты: например, ps -ef -o pid= (это также позволит вам исключить grep -v). Вы можете использовать grep -q, чтобы избежать перенаправления. Ваши подсказки/вводы могут быть в while циклах, если вы хотите избежать сброса.   -  person Dennis Williamson    schedule 02.01.2010
comment
На самом деле, я должен был сказать ps -eo pid=   -  person Dennis Williamson    schedule 02.01.2010


Ответы (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]
person Dennis Williamson    schedule 01.01.2010
comment
В итоге я использовал комбинацию этого ответа и ответа Алекса выше. Спасибо банде! - person Almo; 02.01.2010

Обычный способ сделать это выглядит примерно так:

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

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

$(...), «подстановка команды», принимает в качестве результата стандартный вывод «команды» (поэтому он не показывает echo на вашем терминале и т. д.).

person Alex Martelli    schedule 01.01.2010
comment
Дополнительные кавычки не нужны: read -p "$1: " val и echo "pid:$pid!" (хотя в подсказке лишний восклицательный знак, заключенный в двойные кавычки, вызовет ошибку «событие истории не найдено». В скрипте это не будет проблемой. - person Dennis Williamson; 02.01.2010

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

promptValue "type something"
foo=$pid
person ennuikiller    schedule 01.01.2010