bash func bash function return

admin2024-08-22  9


前些时候看有人定义Bash函数时,用return返回自定义的数值,1表示是,0表示否,这是用对其他语言函数的理解来定义Bash函数,这种思路在Bash里是有问题的。

下面用一个例子来给说明这种方法会碰上什么问题。定义一个简单的函数,如果输入字符串的长度大于等于8返回1,否则返回0。

function validate() {
  if [ ${#1} -ge 8 ]; then
    return 1;
  else
    return 0;
  fi
}

调用这个函数:

validate $str
if [ $? -eq 1 ] ; then 
  echo 'ok'
fi

因为Shell的惯例是命令成功返回0,熟练点的Shell程序员看到"$? -eq 1"而不是"$? -eq 0",很容易疑惑这里是不是有什么问题。当然这不是大问题,只这点的话,也在接受范围内。

但如果想用更简洁的方式调用函数,就会有新问题了:

if validate $str ; then
  echo 'ok'
fi

或者

validate $str && echo 'ok'

这两种调用方式是很多Shell程序员喜欢用的方式,但用在上面的validate函数上,得到的结果都是相反的,所以其他人在用这个函数的时候,是很容易出错的。

另外Bash规定了返回值的范围是0-255,超出这个范围的值对256取模再返回;如果要返回的值可能在这个范围之外,比如查找指定进程的id或者当前的网络连接数,这种做法就是在给自己挖坑了。

Shell中的function,本质是脚本内的脚本,传参数的方式与向脚本传参数的方式一致,同样return的含义与脚本中exit的含义也是一样的,目的都是为了给调用者指示脚本是否正确执行,而不是返回数据给调用者。调用函数的时候,跟执行一个命令或者脚本没有区别,可以使用重定向和管道,甚至可以用符号展开(比如Glob和~)。在定义函数的时候,最好也用写脚本的思维去写,把要做的工作做好就是了,不用关心返回什么数据给调用者。如果确实需要从函数中返回数据,可以想想在调用'pwd'和'ps'等命令时,我们是怎么获取这些命令提供的数据,直接把数据echo出来就是了,不用考虑调用者怎么用或者用不用。

按照这个理解,上面的validate函数可以这样定义:

function validate() {
  [ ${#1} -ge 8 ]
}



定义简单,调用也方便。






本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明原文出处。如若内容造成侵权/违法违规/事实不符,请联系SD编程学习网:675289112@qq.com进行投诉反馈,一经查实,立即删除!