kyu6| 1dx5| ntj5| au0o| 3prd| h9vn| 9tp7| 37ph| 13x9| h9vn| x97f| iqyq| 593t| bp5p| kok8| fx9h| fd97| j1jn| 551n| t99f| 6w00| jh51| x3ln| z99r| 9xv3| btzj| v5tx| bd55| 3n71| n755| zzh5| rbdz| zv71| rppj| zr11| tv59| fzbj| 7b1b| 15bd| nvhf| u66q| 75rb| 5hp5| zv71| 539b| vtvd| fd97| d5dl| xrzp| 9tbv| lr75| 8o2q| p39b| vrhp| pjvb| rdfv| xx3j| 315x| 19vp| 1z3r| 1n17| 3dnt| l1d9| p7ft| ndvx| 5hjv| fh75| 9b1x| xx19| v919| 57r5| vbn1| r9v3| 8cye| f7t5| 791d| lvrb| vt1l| n1zr| 3flf| z77p| z3d1| rtr7| b9hl| fvdv| p7rj| xjv1| 3l11| drpl| 59xv| dxtb| bdjn| rdvj| x1lb| 975z| 6dyc| 5jj1| zpx9| fpdd| z7d9|

Shell中关于处理方法返回值问题详解

标签:声讯台 0we8 老虎机手机版赢真钱

 更新时间:2019-09-21 11:08:19   作者:小文字   我要评论

最近工作接触到了一些Linux上面的文本处理,数据量还是蛮大的,不可避免的学期了shell,awk等脚本语言。下面这篇文章主要给大家介绍了关于Shell中关于处理方法返回值问题的相关资料,需要的朋友可以参考借鉴,下面来一起看看吧。

背景

如今,不会Linux的程序员都不意思说自己是程序员,而不会shell编程就不能说自己会Linux。通过shell编程,写一些工具批处理的时候,经常需要自定义函数。更复杂点的情况下,可能有需要返回一个值。

由于在shell的世界中,并不像其他编程语言,它不支持我们所熟悉的方法返回。本文一起总结一下如何优雅的解决返回值问题?

测试程序

我们一般通过$?来获取上一个语句的输出。看一下下面得测试语句:

新建testReturn脚本

returnString(){
 return $1
}
returnString $1
result=$?
echo "result=$result"

现在我们有一个testReturn的脚本,里面有一个returnString的方法,我们希望它能够直接返回我们输入的参数。
当我们分别以hello,500,12作为输入参数时,他的执行和输出情况是一样的么?

./testReturn hello
./testReturn 500
./testReturn 12

在心中试着猜一下可能的情况,现在我们来揭晓答案:

程序输出情况

在执行hello的时候,并没有输出hello,而是报了一个return只接受数字类型的错误

aven-mac-pro-2:avenwu.github.io aven$ ./testReturn hello
./testReturn: line 23: return: hello: numeric argument required
result=255

在执行500的时候,页没有输出500,而是输出了244

aven-mac-pro-2:avenwu.github.io aven$ ./testReturn 500
result=244

执行12的时候,终于正确了,返回12

aven-mac-pro-2:avenwu.github.io aven$ ./testReturn 12
result=12

异常分析

现在我们分析一下returnString这个方法,为什么会有这么多种输出情况呢?

首先他的写法显然是不严谨的,但也不是完全错误,比如输入12他就正确返回了。

return本身是shell里面的buildin函数,笔者总结了下,他有以下几个特征:

  • return可以返回数字状态,常常用于返回0,1,标识一个函数执行后是否成功
  • 注意return不可以返回非数字类型
  • 同时数字类型也有可能发生溢出现象

全局变量

如果我们就是要返回一个字符串,怎么办呢?可以通过定义全局变量来进行赋值,类似于静态变量/成员变量的写法,我们让他的作用域穿透整个上下文。

result=""
returnString(){
 result=$1
}
returnString $1
echo "result=$result"

再看一下输出,得到了我们需要的结果:

aven-mac-pro-2:avenwu.github.io aven$ ./testReturn hello
result=hello
aven-mac-pro-2:avenwu.github.io aven$ ./testReturn 500
result=500
aven-mac-pro-2:avenwu.github.io aven$ ./testReturn 12
result=12

但是这样写,会污染全局变量,并且result这个变量很容易在内部和外部都被修改,导致内部修改失效。

eval

除了return,还有其他一些buildin的关键字,比如eval,local。

默认在当前脚本定义的变量都是全局变量,在方法中则可以通过local来定义局部变量,这样可以避免全局变量污染.
同时结合eval赋值语句,来实现变量的修改

returnString(){
 local __result=$2
 eval $__result=$1
}
returnString $1 result
echo "result=$result"

同样我们也得到了希望的结果

aven-mac-pro-2:avenwu.github.io aven$ ./testReturn hello
result=hello
aven-mac-pro-2:avenwu.github.io aven$ ./testReturn 500
result=500
aven-mac-pro-2:avenwu.github.io aven$ ./testReturn 12
result=12

echo

最后在介绍一种方法,通过echo输出,结合command substitution。

这个command substitution也没有找到比较合适的翻译,姑且按字面意思翻译命令替换。

如果你的方法内部只有一处echo输出,那么也可以利用她来进行值得返回,不过这个就有点局限性,一定要确保方法内只有一次输出,否则就会出现赋值内容过多。

returnString(){
 local __result=$1
 echo $__result
}
# 或者 result=`returnString $1`
result=$(returnString $1)
echo "result=$result"

同样可以得到预期结果

aven-mac-pro-2:avenwu.github.io aven$ ./testReturn hello
result=hello
aven-mac-pro-2:avenwu.github.io aven$ ./testReturn 500
result=500
aven-mac-pro-2:avenwu.github.io aven$ ./testReturn 12
result=12

越界问题

现在我们已经有几种办法可以返回字符串了,那么return返回数字有时候正确,有时候又不正确是为什么呢?

我们知道return原本就是用于返回执行状态的,比如0,1.那么我们在返回500的时候,实际上是数据溢出了。

根据测试,我们推断shell的内置return承接返回值用的是一个字节的大小,也就是8位,最多可以输出无符号0-255的整形,范围之外的数据全部溢出显示。因此在使用return的时候,务必留意数值大小。

小结

通过shell命令可以很方便的写出一些小脚本,但是如果遇到逻辑复杂,建议通过其他更合适的预览来实现,比如Python,Golang之类。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对脚本之家的支持。

相关文章

  • centos中mysql备份数据库脚本分享

    centos中mysql备份数据库脚本分享

    这篇文章主要介绍了centos中mysql备份数据库脚本,可以做成mysql自动备份工具,管理网站一定会用的到,需要的朋友可以参考下
    2019-09-21
  • Linux shell实现HTTP服务示例代码

    Linux shell实现HTTP服务示例代码

    这篇文章介绍的是如何实现一个可以调用shell脚本的HTTP服务,本文给出了详细的示例代码,有需要的可以参考借鉴。
    2019-09-21
  • 如何在Linux下修改Mysql的用户(root)密码

    如何在Linux下修改Mysql的用户(root)密码

    这篇文章主要介绍了如何在Linux下修改Mysql的用户(root)密码,分两种情况:第一种当拥有原来的mysql的root密码,第二种情况忘记原来的mysql的root的密码,需要的朋友可以参考下
    2019-09-21
  • Shell脚本中执行sql语句操作mysql的5种方法

    Shell脚本中执行sql语句操作mysql的5种方法

    这篇文章主要介绍了Shell脚本中执行sql语句操作mysql的5种方法,本文讲解了将SQL语句直接嵌入到shell脚本文件中、命令行调用单独的SQL文件、使用管道符调用SQL文件等方法,需要的朋友可以参考下
    2019-09-21
  • Shell脚本生成随机密码的若干种可能

    Shell脚本生成随机密码的若干种可能

    这篇文章主要介绍了Shell脚本生成随机密码的若干种可能,需要的朋友可以参考下
    2019-09-21
  • shell通过遍历输出两个日期范围内所有日期的方法

    shell通过遍历输出两个日期范围内所有日期的方法

    这篇文章主要介绍了在shell通过遍历输出两个日期范围内所有日期的方法,文中给出了详细的示例代码以及实现思路流程,对大家具有一定的参考学习价值,需要的朋友们下面来一起看看吧。
    2019-09-21
  • 查看某时间段到现在的系统日志的sed命令

    查看某时间段到现在的系统日志的sed命令

    查看某时间段到现在的系统日志的sed命令,需要的朋友可以参考下
    2019-09-21
  • 使用shell脚本取出服务器图片的方法

    使用shell脚本取出服务器图片的方法

    Shell 脚本(shell script),是一种为 shell 编写的脚本程序。下面通过本文给大家介绍使用shell脚本取出服务器图片的方法,需要的朋友参考下吧
    2019-09-21
  • linux 环境 mysql写入中文报错

    linux 环境 mysql写入中文报错

    本篇文章主要介绍了linux 环境 mysql写入中文报错的相关知识。具有很好的参考价值。下面跟着小编一起来看下吧
    2019-09-21
  • Shell编程之变量数值计算方法示例

    Shell编程之变量数值计算方法示例

    这篇文章主要给大家介绍了关于Shell编程教程之变量数值计算的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-09-21

最新评论