Unix shell 函数、命令替换和退出

发布于 2024-12-08 07:00:51 字数 1133 浏览 0 评论 0原文

请解释一下如何正确使用unix shell功能。

例如,我们有以下函数 f 和 g:

f()
{
   #do something
   return $code
}

g()
{
   print $something
}

我们可以通过以下方式使用函数 f:

f
if [[ $? -eq 0 ]]; then
   #do 1
else
   #do 2
fi

该函数执行一些工作并以某种退出状态退出。
我们可以分析这个退出状态。

我们可以通过以下方式使用函数 g:

g

或者

result=$(g)
if [[ $result = "something" ]]; then
   #do something
fi

在第一种情况下我们只是调用函数。
在第二种情况下,我们使用命令替换将函数打印到标准输出的所有文本分配给变量结果。

但是如果有以下函数怎么办:

z()
{
   user=$1
   type=$2
   if [[ $type = "customer" ]]; then
      result=$(/somedir/someapp -u $user)
      if [[ $result = "" ]]; then
         #something goes wrong
         #I do not want to continue
         #I want to stop whole script
         exit 1
      else
         print $result
      fi
   else
      print "worker"
   fi
}

我可以用下一种方式使用函数 z:

z

如果出现问题,那么整个脚本将停止。
但是如果有人在命令替换中使用此函数怎么办:

result=$(z)

在这种情况下,如果 someapp 返回空字符串脚本将不会停止。
在函数中使用 exit 不是正确的方法吗?

Please explain me about how to use unix shell function correctly.

For example we have following functions f and g:

f()
{
   #do something
   return $code
}

g()
{
   print $something
}

We can use function f in the next way:

f
if [[ $? -eq 0 ]]; then
   #do 1
else
   #do 2
fi

This function performs some work and exits with some exit status.
And we can analyze this exit status.

We can use function g in the next way:

g

or

result=$(g)
if [[ $result = "something" ]]; then
   #do something
fi

In first case we just called function.
In the second case we used command substitution to assign all text that function prints to stdout to variable result.

But what if there is following function:

z()
{
   user=$1
   type=$2
   if [[ $type = "customer" ]]; then
      result=$(/somedir/someapp -u $user)
      if [[ $result = "" ]]; then
         #something goes wrong
         #I do not want to continue
         #I want to stop whole script
         exit 1
      else
         print $result
      fi
   else
      print "worker"
   fi
}

I can use function z in the next way:

z

If something goes wrong then whole script will be stopped.
But what if somebody uses this function in command substitution:

result=$(z)

In this case if someapp returns empty string script will not be stopped.
Is it not correct approach to use exit in functions?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

清眉祭 2024-12-15 07:00:51

我现在没有办法测试这个,但是 ksh (也许 bash 也是)可以在函数内定义变量的范围。

z()
{
   typeset result
   user=$1
   type=$2
   if [[ $type = "customer" ]]; then
      result=$(/somedir/someapp -u $user)
      if [[ $result = "" ]]; then
         #something goes wrong
         #I do not want to continue
         #I want to stop whole script
         exit 1
      else
         print $result
      fi
   else
      print "worker"
   fi
}

请注意在顶部附近插入的排版结果

您可能需要使用函数的替代声明才能使此功能正常工作,即

 function z {
    #....
  }

我希望这会有所帮助。

你也可以做类似的事情

  result=$(z ; "eval retCode=\$? ; echo \$retCode" )

I don't have a way to test this right now, but ksh (maybe bash too), can scope variables inside functions.

z()
{
   typeset result
   user=$1
   type=$2
   if [[ $type = "customer" ]]; then
      result=$(/somedir/someapp -u $user)
      if [[ $result = "" ]]; then
         #something goes wrong
         #I do not want to continue
         #I want to stop whole script
         exit 1
      else
         print $result
      fi
   else
      print "worker"
   fi
}

Notice the insertion of typeset result near the top.

You may need to use the alternate declartion of function for this feature to work, i.e.

 function z {
    #....
  }

I hope this helps.

You could also do something like

  result=$(z ; "eval retCode=\$? ; echo \$retCode" )
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文