Ответ 1
Измените эту строку:
return $value
вот так:
echo $value
Затем вы можете записать его.
Я знаю некоторые очень простые команды в Linux и пытаюсь написать некоторые скрипты. Я написал функцию, которая вычисляет сумму последних двух цифр в пятизначном номере. Функция должна объединить эту итоговую сумму между двумя последними цифрами и вернуть ее. Причина, по которой я хочу вернуть это значение, заключается в том, что я буду использовать это значение в другой функции.
Ex: если у меня 12345, тогда моя функция будет вычислять 4 + 5 и возвращать 495.
#!/bin/bash
set -x
echo "enter: "
read input
function password_formula
{
length=${#input}
last_two=${input:length-2:length}
first=`echo $last_two| sed -e 's/\(.\)/\1 /g'|awk '{print $2}'`
second=`echo $last_two| sed -e 's/\(.\)/\1 /g'|awk '{print $1}'`
let sum=$first+$second
sum_len=${#sum}
echo $second
echo $sum
if [ $sum -gt 9 ]
then
sum=${sum:1}
fi
value=$second$sum$first
return $value
}
result=$(password_formula)
echo $result
Я пытаюсь эхо и вижу результат, но я получаю вывод, как показано ниже.
-bash-3.2$ ./file2.sh
+++ password_formula
+++ echo 'enter: '
+++ read input
12385
+++ length=8
+++ last_two=85
++++ echo 85
++++ sed -e 's/\(.\)/\1 /g'
++++ awk '{print $2}'
+++ first=5
++++ echo 85
++++ sed -e 's/\(.\)/\1 /g'
++++ awk '{print $1}'
+++ second=8
+++ let sum=5+8
+++ sum_len=2
+++ echo 5
+++ echo 8
+++ echo 13
+++ '[' 13 -gt 9 ']'
+++ sum=3
+++ value=835
+++ return 835
++ result='enter:
5
8
13'
++ echo enter: 5 8 13
enter: 5 8 13
Я также попытался напечатать результат как:
password_formula
RESULT=$?
echo $RESULT
Но это дает некоторое неизвестное значение:
++ RESULT=67
++ echo 67
67
Как правильно сохранить правильное значение и распечатать (чтобы проверить дважды) на экране?
Спасибо заранее.
Измените эту строку:
return $value
вот так:
echo $value
Затем вы можете записать его.
Возвращаемое значение (иначе код выхода) представляет собой значение в диапазоне от 0 до 255 включительно. Он использовался для указания успеха или неудачи, а не для возврата информации. Любое значение вне этого диапазона будет обернуто.
Чтобы вернуть информацию, например, свой номер, используйте
echo "$value"
Чтобы распечатать дополнительную информацию, которую вы не хотите снимать, используйте
echo "my irrelevant info" >&2
Наконец, чтобы захватить его, используйте то, что вы сделали:
result=$(password_formula)
Другими словами:
echo "enter: "
read input
password_formula()
{
length=${#input}
last_two=${input:length-2:length}
first=`echo $last_two| sed -e 's/\(.\)/\1 /g'|awk '{print $2}'`
second=`echo $last_two| sed -e 's/\(.\)/\1 /g'|awk '{print $1}'`
let sum=$first+$second
sum_len=${#sum}
echo $second >&2
echo $sum >&2
if [ $sum -gt 9 ]
then
sum=${sum:1}
fi
value=$second$sum$first
echo $value
}
result=$(password_formula)
echo "The value is $result"
Вам легко повторить значение, которое нужно вернуть, а затем захватить его, как показано ниже.
demofunc(){
local variable="hellow"
echo $variable
}
val=$(demofunc)
echo $val
Ответ выше предлагает изменить функцию для эхо-данных, а не возвращать ее, чтобы ее можно было захватить.
Для функции или программы, которую вы не можете изменить, где нужно вернуть возвращаемое значение в переменную (например, test
/[
, которая возвращает значение успеха 0/1), echo $?
внутри подстановка команды:
# Test if we're remote.
isRemote="$(test -z "$REMOTE_ADDR"; echo $?)"
# Or:
isRemote="$([ -z "$REMOTE_ADDR" ]; echo $?)"
# Additionally you may want to reverse the 0 (success) / 1 (error) values
# for your own sanity, using arithmetic expansion:
remoteAddrIsEmpty="$([ -z "$REMOTE_ADDR" ]; echo $((1-$?)))"
например.
$ echo $REMOTE_ADDR
$ test -z "$REMOTE_ADDR"; echo $?
0
$ REMOTE_ADDR=127.0.0.1
$ test -z "$REMOTE_ADDR"; echo $?
1
$ retval="$(test -z "$REMOTE_ADDR"; echo $?)"; echo $retval
1
$ unset REMOTE_ADDR
$ retval="$(test -z "$REMOTE_ADDR"; echo $?)"; echo $retval
0
Для программы, которая печатает данные, но также имеет возвращаемое значение для сохранения, возвращаемое значение будет записано отдельно от выхода:
# Two different files, 1 and 2.
$ cat 1
1
$ cat 2
2
$ diffs="$(cmp 1 2)"
$ haveDiffs=$?
$ echo "Have differences? [$haveDiffs] Diffs: [$diffs]"
Have differences? [1] Diffs: [1 2 differ: char 1, line 1]
$ diffs="$(cmp 1 1)"
$ haveDiffs=$?
$ echo "Have differences? [$haveDiffs] Diffs: [$diffs]"
Have differences? [0] Diffs: []
# Or again, if you just want a success variable, reverse with arithmetic expansion:
$ cmp -s 1 2; filesAreIdentical=$((1-$?))
$ echo $filesAreIdentical
0
Самый простой ответ:
код возврата от функции может быть только значением в диапазоне от 0 до 255. Чтобы сохранить это значение в переменной, вы должны сделать, как в этом примере:
#!/bin/bash
function returnfunction {
# example value between 0-255 to be returned
return 23
}
# note that the value has to be stored immediately after the function call :
returnfunction
myreturnvalue=$?
echo "myreturnvalue is "$myreturnvalue
Это из-за операторов echo
. Вы можете переключить эхо на печать и вернуться с помощью echo
. Ниже работ
#!/bin/bash
set -x
echo "enter: "
read input
function password_formula
{
length=${#input}
last_two=${input:length-2:length}
first=`echo $last_two| sed -e 's/\(.\)/\1 /g'|awk '{print $2}'`
second=`echo $last_two| sed -e 's/\(.\)/\1 /g'|awk '{print $1}'`
let sum=$first+$second
sum_len=${#sum}
print $second
print $sum
if [ $sum -gt 9 ]
then
sum=${sum:1}
fi
value=$second$sum$first
echo $value
}
result=$(password_formula)
echo $result
Использовать специальную переменную bash "$?" так:
function_output=${my_function}
function_return_value=$?