linux在哪里储存变量值,关于linux:在bash中,如何在变量中存储返回值?

我知道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值。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值