我知道Linux中一些非常基本的命令,并且正在尝试编写一些脚本。 我编写了一个函数,用于评估5位数字中最后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
如何正确存储正确的值并在屏幕上打印(以进行双重检查)?
提前致谢。
在这里使用反引号似乎不合适。 您可以执行first=${last_two:0:1}和second=${last_two:1:1}或first=${last_two%?}和second=${last_two#?}
对于习惯于高级语言的人," return"语句的名称具有误导性-更好的名称可能是" exit_status"。 如果要返回由字符串值或数字值> 255组成的结果,则必须通过" echo"或其他输出到stdout的方法来完成。
返回值(也就是退出代码)是介于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"
问题是我需要使用stdout而不是stderr。
正确答案使用$?
@Eric出于本文所述的原因,您不能使用$?来恢复OP 495之类的返回值。即使您的值确实在退出代码的有限范围内,为此目的重复使用它也违反了posix约定,并混淆了其他希望退出代码是成功指标的工具
抱歉,我没有读最初的问题,只是标题:)我没有意识到他问过如何传递大于255的值。正确的答案是设计上无法实现,但是有一些解决方法,例如使用stdout。
最简单的答案:
函数的返回码只能是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
这是这里唯一正确的答案。在此特定情况下,将功能从返回更改为回声的最佳答案可能会起作用,但当然不是大多数读者正在寻找的理想答案。
您很容易需要回显需要返回的值,然后按如下所示捕获它
demofunc(){
local variable="hellow"
echo $variable
}
val=$(demofunc)
echo $val
这应该是公认的答案。当前的语法是不完整的和不正确的语法。
我同意。这是最容易使用的。
如果在echo $variable之前添加echo 555或类似的内容,它将与$variable连接,这很糟糕
请注意,$(demofunc)在子外壳程序中执行demofunc。 demofunc中的echo不会在当前shell中显示。所以我认为更好的答案是stackoverflow.com/a/35223671/1803897
使用特殊的bash变量" $?"像这样:
function_output=${my_function}
function_return_value=$?
您是说$(my_function),而不是${my_function},对吗?
上面的答案建议将函数更改为回显数据而不是返回数据,以便可以捕获它。
对于您无法修改需要将返回值保存到变量的位置的函数或程序(如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-$?)))"
例如。
$ 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
这是由于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
非常感谢大家的详细说明。现在可以使用了。
问题是如何获取返回值,而不是echo ed值。