从外壳脚本函数
一个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
是一种任意例如)
为什么不用'$ R'跳过整个时髦的业务,然后运行'ls'然后'返回$?'? – Caleb 2013-07-31 08:44:18
@Caleb - 这个答案是对PeterMmm原始脚本的修改,以演示shell函数如何返回值。我相信整个样本函数可以被忽略,但我不知道他在真实代码中可能会做什么。 – 2013-07-31 23:54:46
a() {
ls -1 a* > /dev/null
[ "$?" == "0" ] && echo t || echo f
}
r=`a`
echo $r
考虑使用[-f文件名]和其他文件测试。
您不必使用ls
来检查从a
开始的文件。只需使用shell
a() {
shopt -s nullglob
ret="f"
for file in a*
do
ret="t"
break
done
echo "$ret"
}
这是一个例子,不是我的问题。如何避免写入无处不在“>/dev/null 2>/dev/null”当我想从脚本函数中获取单个值/字符串时。 – PeterMmm 2010-06-29 12:01:53
你可以把一个重定向命令的列表:
{ 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.
'r = $(a); echo $ r'当然可以用'a'代替。 – 2012-05-19 12:37:24