2010-06-29 144 views
5

实施例返回一个值。从外壳脚本函数

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

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

+0

'r = $(a); echo $ r'当然可以用'a'代替。 – 2012-05-19 12:37:24

回答

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是一种任意例如)

+0

为什么不用'$ R'跳过整个时髦的业务,然后运行'ls'然后'返回$?'? – Caleb 2013-07-31 08:44:18

+0

@Caleb - 这个答案是对PeterMmm原始脚本的修改,以演示shell函数如何返回值。我相信整个样本函数可以被忽略,但我不知道他在真实代码中可能会做什么。 – 2013-07-31 23:54:46

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

} 

r=`a` 
echo $r 

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

1

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

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

这是一个例子,不是我的问题。如何避免写入无处不在“>/dev/null 2>/dev/null”当我想从脚本函数中获取单个值/字符串时。 – PeterMmm 2010-06-29 12:01:53

1

你可以把一个重定向命令的列表:

 
{ 
    command1 
    command2 
} >/dev/null 

如果在脚本中的某些时候,你不想从后续命令的任何输出,你可以重定向外壳的与exec内置输出:

 
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.