示例:
#!/bin/sh
a() {
R=f
ls -1 a*
[ "$?" == "1" ] && { R=t; }
echo $R
}
r=`a`
echo $r
$r
包含t
或f
,但也包含ls
命令的输出。
我可以写ls -1 a* >/dev/null 2>/dev/null
,但如果有更复杂的脚本可能会导致错误。
有没有办法从a()
返回单个值?
答案 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]和其他文件测试。