浅谈获取shell中函数的返回值
2016-01-25 15:46
477 查看
首先看看怎么获取命令的返回值,
根据linux标准,返回0就是正确,非0就是错误的原则,只要命令执行正确,返回的一般都是0,那么怎么获取命令的返回值??用位置参数 $?
$? 获取上一个指令的返回值 (显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误)
[plain] view
plaincopy
ls -l
a=$?
lss
b=$?
echo $a $b
最后得到 a是0,b是127,至于为什么是127,这个我还不晓得
回过头来,shell中函数也相当于一条命令,那么能不能用$?来获取函数的返回值呢?just try try
[plain] view
plaincopy
#!/usr/bin/bash
add()
{
a=$1
b=$2
ret=`expr $a + $b`
return $ret
}
add $1 $2
sum=$?
echo "$1 + $2 = " $sum
可以看到,传入30和40之后,用$?得到了add函数的返回值,返回值是70,是正确的,由此可见,用$?确实可以得到函数的返回值,但需要注意的是$?得到仅仅是上一条命令的返回值,这就是说假如在调用add之后没有用$?获取,那就再也获取不到返回值了。
[plain] view
plaincopy
#!/usr/bin/bash
add()
{
a=$1
b=$2
ret=`expr $a + $b`
return $ret
}
add $1 $2
echo 'hello world'
sum=$?
echo "$1 + $2 = " $sum
这个代码中只是在add 调用后加了个echo 'hello world‘,那么再用$?获取的就是echo的返回值了,而add的返回值无法获取了,这很不方便,那么有没有其他方法呢?
linux中反引号(`)是命令替换,指的是会把引号中的语句当成命令来执行,那么能不能把函数放在反引号中呢? just try try
[plain] view
plaincopy
#!/usr/bin/bash
add()
{
a=$1
b=$2
ret=`expr $a + $b`
echo $ret
}
sum=`add $1 $2`
echo 'hello world'
echo "$1 + $2 = " $sum
哇塞,真的可以,可以通过反引号来获取函数的返回值。
注意:add 函数最后是echo 而不是return,这就意味着add 函数中的所有 echo 主程序都收到了,这貌似也有不太好。
对比这两者方法:
第一种:获取函数的返回状态,要想获取返回值,则必须紧跟函数
第二种:函数的所有标准输出都传递给了主程序的变量,要求函数中不能出现额外的输出,但是假如函数有多个返回值,这也不失为一个好方法
还记得前面提到命令执行正确时返回127么,为啥是127? 127在程序中太特殊了,它是char表示的最大值,照这样来说命令的返回值是不是有范围限制??
[plain] view
plaincopy
#!/usr/bin/bash
testret()
{
return $1
}
testret -127
echo "-127 return $?"
testret -1
echo -1 return "$?"
testret 0
echo "0 return $?"
testret 1
echo "1 return $?"
testret 255
echo "255 return $?"
testret 256
echo "256 return $?"
testret 1024
echo "1024 return $?"
~
这个程序很简单吧,就是将传入函数的参数又返回了。但是看看结果吧!
看见没,传入-127和-1的时候报了个invalid option,而且后面传入大于255的数时返回值都是0,由此可见,$?获取的数值是有范围的,类似于unsigned char的范围,假如你的函数返回了一个大于255的数,那么用$?是获取不到返回值的。
另外补充一点:
但是shell的变量只要在一个地方定义了,其他任何地方就可以用了,所以说怎么获取返回值貌似不太那么重要,有如下一句话:
The simplest way to return a value from a bash function is to just set a global variable to the result. Since all variables in bash are global by default this is easy:
function myfunc()
{
myresult='some value'
}
myfunc
echo $myresult
根据linux标准,返回0就是正确,非0就是错误的原则,只要命令执行正确,返回的一般都是0,那么怎么获取命令的返回值??用位置参数 $?
$? 获取上一个指令的返回值 (显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误)
[plain] view
plaincopy
ls -l
a=$?
lss
b=$?
echo $a $b
最后得到 a是0,b是127,至于为什么是127,这个我还不晓得
回过头来,shell中函数也相当于一条命令,那么能不能用$?来获取函数的返回值呢?just try try
[plain] view
plaincopy
#!/usr/bin/bash
add()
{
a=$1
b=$2
ret=`expr $a + $b`
return $ret
}
add $1 $2
sum=$?
echo "$1 + $2 = " $sum
可以看到,传入30和40之后,用$?得到了add函数的返回值,返回值是70,是正确的,由此可见,用$?确实可以得到函数的返回值,但需要注意的是$?得到仅仅是上一条命令的返回值,这就是说假如在调用add之后没有用$?获取,那就再也获取不到返回值了。
[plain] view
plaincopy
#!/usr/bin/bash
add()
{
a=$1
b=$2
ret=`expr $a + $b`
return $ret
}
add $1 $2
echo 'hello world'
sum=$?
echo "$1 + $2 = " $sum
这个代码中只是在add 调用后加了个echo 'hello world‘,那么再用$?获取的就是echo的返回值了,而add的返回值无法获取了,这很不方便,那么有没有其他方法呢?
linux中反引号(`)是命令替换,指的是会把引号中的语句当成命令来执行,那么能不能把函数放在反引号中呢? just try try
[plain] view
plaincopy
#!/usr/bin/bash
add()
{
a=$1
b=$2
ret=`expr $a + $b`
echo $ret
}
sum=`add $1 $2`
echo 'hello world'
echo "$1 + $2 = " $sum
哇塞,真的可以,可以通过反引号来获取函数的返回值。
注意:add 函数最后是echo 而不是return,这就意味着add 函数中的所有 echo 主程序都收到了,这貌似也有不太好。
对比这两者方法:
第一种:获取函数的返回状态,要想获取返回值,则必须紧跟函数
第二种:函数的所有标准输出都传递给了主程序的变量,要求函数中不能出现额外的输出,但是假如函数有多个返回值,这也不失为一个好方法
还记得前面提到命令执行正确时返回127么,为啥是127? 127在程序中太特殊了,它是char表示的最大值,照这样来说命令的返回值是不是有范围限制??
[plain] view
plaincopy
#!/usr/bin/bash
testret()
{
return $1
}
testret -127
echo "-127 return $?"
testret -1
echo -1 return "$?"
testret 0
echo "0 return $?"
testret 1
echo "1 return $?"
testret 255
echo "255 return $?"
testret 256
echo "256 return $?"
testret 1024
echo "1024 return $?"
~
这个程序很简单吧,就是将传入函数的参数又返回了。但是看看结果吧!
看见没,传入-127和-1的时候报了个invalid option,而且后面传入大于255的数时返回值都是0,由此可见,$?获取的数值是有范围的,类似于unsigned char的范围,假如你的函数返回了一个大于255的数,那么用$?是获取不到返回值的。
另外补充一点:
但是shell的变量只要在一个地方定义了,其他任何地方就可以用了,所以说怎么获取返回值貌似不太那么重要,有如下一句话:
The simplest way to return a value from a bash function is to just set a global variable to the result. Since all variables in bash are global by default this is easy:
function myfunc()
{
myresult='some value'
}
myfunc
echo $myresult
相关文章推荐
- 几个 shell 的题目
- shell脚本-纵和文件查询wifi国家码
- SHELL编程四剑客练习--grep
- SSH Secure Shell Client 中文乱码解决方法
- Android_adb shell am/pm使用
- 使用Teamcity自构建之-运行powershell脚本
- linux下 bash:command not found解决方法
- SHELL编程四剑客练习--awk
- Spark入门实战系列--3.Spark编程模型(上)--编程模型及SparkShell实战
- 通过xshell远程登录linux在vim编辑器里编辑东西按数字键出现英文字母的解决办法
- shell脚本案例
- (1)shell脚本介绍
- [小技巧] shell 下查看串口是否工作正常
- hadoop学习笔记(11)——hbase shell简单操作示例
- 使用WPScan扫描wordpress获取用户密码
- Git Bash 记住用户名密码
- Jmeter之Bean shell使用(一)
- Jmeter之Bean shell使用(二)
- Powershell之MOF后门
- SHELL编程四剑客练习--sed