5

例子:

#!/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

4 回答 4

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是一个任意示例)

于 2010-07-09T01:01:40.783 回答
1

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

a() {
  shopt -s nullglob
  ret="f"
  for file in a*
  do   
    ret="t"
    break
  done
  echo "$ret"
}
于 2010-06-29T11:44:46.287 回答
1

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

{
  命令1
  命令2
} >/dev/null

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

回声有趣
执行 >/dev/null
回声无聊

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

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

{
  exec 3>&1 # 复制 fd 3 到 fd 1(标准输出)
  exec >/dev/null # 连接标准输出到 /dev/null
  回声无聊
  exec 1>&3 # 将标准输出连接回保存在 fd 3 中的内容
  回声有趣
  exec >/dev/null # 再次连接标准输出到 /dev/null
  回声更无聊
} 3>/dev/null # 花括号列表的 fd 3 必须连接到某个地方,
                    # 即使实际上不会写入任何内容。
于 2010-07-08T23:26:15.737 回答
0
a() { 
ls -1 a*  > /dev/null
[ "$?" == "0" ] && echo t  || echo f

} 

r=`a` 
echo $r 

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

于 2010-06-29T11:13:00.127 回答