从shell脚本函数返回单个值

时间:2010-06-29 10:27:06

标签: shell return-value bash-function

示例:

#!/bin/sh

a() {
R=f
ls -1 a*
[ "$?" == "1" ] && { R=t; }
echo $R
}

r=`a`
echo $r

$r包含tf,但也包含ls命令的输出。

我可以写ls -1 a* >/dev/null 2>/dev/null,但如果有更复杂的脚本可能会导致错误。

有没有办法从a()返回单个值?

4 个答案:

答案 0 :(得分:4)

shell函数可以返回数值。考虑0和1而不是'f'和't'

#!/bin/sh

a() {
R=0
ls -1 a*
[ "$?" == "1" ] && { R=1; }
return $R
}

a
r=$?
echo $r

这仍然会写出您可能仍想要处理的ls -1 a*的输出,但r的值将为0或1,并且不包括输出。

从一行或整个块重定向输出的其他示例都很好,而且正如其他人所建议的那样,您应该了解其他测试条件的方法(但我假设ls是善良的一个任意的例子)

答案 1 :(得分:1)

您不必使用ls来检查以a开头的文件。只需使用shell

a() {
  shopt -s nullglob
  ret="f"
  for file in a*
  do   
    ret="t"
    break
  done
  echo "$ret"
}

答案 2 :(得分:1)

您可以在命令列表中放置重定向:

{
  command1
  command2
} >/dev/null

如果在脚本的某个时刻你不想要后续命令的任何输出,你可以使用内置的exec重定向shell的输出:

echo interesting
exec >/dev/null
echo boring

请注意,这将持续到脚本结束,而不仅仅是在函数结束之前。这会在有趣的之后处理命令,但不会在之前处理。

有一种方法可以通过使用文件描述符操作来恢复exec /dev/null的效果。我不一定推荐它,因为在实践中锻炼可能很棘手。我们的想法是将连接到标准输出的任何内容重新定位到不同的描述符,然后将标准输出重定向到不同的文件,最后将原始标准输出重新定位回标准输出。

{
  exec 3>&1         # duplicate fd 3 to fd 1 (standard output)
  exec >/dev/null   # connect standard output to /dev/null
  echo boring
  exec 1>&3         # connect standard output back to what was saved in fd 3
  echo interesting
  exec >/dev/null   # connect standard output to /dev/null again
  echo more boring
} 3>/dev/null       # The braced list must have its fd 3 connected somewhere,
                    # even though nothing will actually be written to it.

答案 3 :(得分:0)

a() { 
ls -1 a*  > /dev/null
[ "$?" == "0" ] && echo t  || echo f

} 

r=`a` 
echo $r 

考虑使用[-f filename]和其他文件测试。