Я пытаюсь записать функцию помощника для использования в сценарии удара, чтобы взять переменную строку приглашения и возвратить значение вводы данных пользователем. То, что я имею, сидит и ждет пользователя для ввода значения, не отображая подсказку сначала, которая является озадачивающей. Это также хранит эхо в возвращаемом значении ($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
Еще раз спасибо все!
]Значения выхода функции совпадают со значениями последней команды, выполненной внутри функции, или со значением, указанным в заявлении []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]
] очевидно, что это сработает, если вы выполните напрямую, а не назначите ее foo. Если Вы пытаетесь захватить значение val, то почему noit просто делает:
promptValue "type something"
foo=$pid
Казалось бы, обычный способ -
#!/bin/bash
pid=0
promptValue() {
read -p "$1"": " val
pid=$val
}
promptValue "type something"
echo 'pid:'$pid'!'
$(...)
, "подстановка команд", в результате принимает стандартный вывод "команды" (поэтому на вашем терминале не отображается echo
и т.д.).