我知道Linux中的一些非常基本的命令,我正在尝试编写一些脚本。我编写了一个函数,用于计算5位数字中最后2位数的总和。该函数应该在最后的2位数之间连接这个结果和并返回它。我想要返回此值的原因是因为我将在其他函数中使用此值。
例如:如果我有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
如何在屏幕上正确存储正确的值并打印(进行双重检查)?
提前致谢。
答案 0 :(得分:24)
返回值(又名退出代码)是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"
答案 1 :(得分:7)
您需要回复返回所需的值,然后像下面那样捕获它
demofunc(){
local variable="hellow"
echo $variable
}
val=$(demofunc)
echo $val
答案 2 :(得分:5)
最简单的答案:
函数的返回码只能是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
答案 3 :(得分:4)
上面的答案建议将函数更改为回显数据而不是返回它以便可以捕获它。
对于无法修改返回值需要保存到变量的函数或程序(如test
/ [
,返回0/1成功值),回显命令替换中的$?
:
# 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-$?)))"
E.g。
$ 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
答案 4 :(得分:3)
使用特殊的bash变量“$?”像这样:
function_output=${my_function}
function_return_value=$?
答案 5 :(得分:1)
这是由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
答案 6 :(得分:0)
可以使用类似的方法,并且仍然保持return
(返回控制信号)和echo
(返回信息)的含义)和日志记录语句(以打印调试/信息消息)。
v_verbose=1
v_verbose_f="" # verbose file name
FLAG_BGPID=""
e_verbose() {
if [[ $v_verbose -ge 0 ]]; then
v_verbose_f=$(tempfile)
tail -f $v_verbose_f &
FLAG_BGPID="$!"
fi
}
d_verbose() {
if [[ x"$FLAG_BGPID" != "x" ]]; then
kill $FLAG_BGPID > /dev/null
FLAG_BGPID=""
rm -f $v_verbose_f > /dev/null
fi
}
init() {
e_verbose
trap cleanup SIGINT SIGQUIT SIGKILL SIGSTOP SIGTERM SIGHUP SIGTSTP
}
cleanup() {
d_verbose
}
init
fun1() {
echo "got $1" >> $v_verbose_f
echo "got $2" >> $v_verbose_f
echo "$(( $1 + $2 ))"
return 0
}
a=$(fun1 10 20)
if [[ $? -eq 0 ]]; then
echo ">>sum: $a"
else
echo "error: $?"
fi
cleanup
在这里,我将调试消息重定向到单独的文件,该文件被尾部监视,如果有任何更改,则打印更改,trap
用于确保后台进程始终结束。 / p>
使用重定向到/dev/stderr
也可以实现此行为,但是在将一个命令的输出管道传输到另一命令的输入时可以看到差异。