1

我尝试通过很多这样的函数生成一个 csv 文件:

function get_sudo_version {
  sudo -V 2>/dev/null|grep -i "sudo version"
}
sudo_version=$(get_sudo_version)

上面的函数是一个简单的例子,但在某些情况下我不能确定输出是否正确。我想知道验证函数仅返回一个文本行的最佳方法是什么。

我想过类似的事情

function validate_output {  
  output=$1; 
  echo $1|grep -q "\n"; 
  echo $?; 
}

mytest="val1
err2
err3"

但这显然不起作用,因为变量不保留重新运行的行字符:

echo $mytest
val1 err2 err3

因此,如果有人对我如何编写通用检查功能有很好的了解,我会很高兴。

谢谢

4

2 回答 2

1

如果你有 GNU grep,你可以简单地确保 grep 首先通过grep -m 1. 或者,使用sed '/sudo version/!d;q'而不是grep.

一个在传递输入行时简单地检查输入行的函数可能如下所示:

shopt -s lastpipe # if bash

# ksh or bash
validate_output() { 
    (( $(tee >(wc -l) >&2) == 1 ))
} 2>&1

# bash
validate_output2() {
    local lines
    tee /dev/fd/2 | mapfile -tc1 -C '((++lines < 2)) || return; :'
    ((lines))
} 2>&1

get_sudo_version | validate_output || echo failed

当然,这可能有很多变化。IMO 这是毫无意义的,不应该用于这样的事情。只需设计您的get_sudo_version,以保证正确的结果。

于 2012-06-19T19:40:49.330 回答
0

您可以计算行数wc -l

$ LINES="$(echo -n | wc -l)"; [[ "$LINES" -gt 0 ]] && echo 'at least one line'

$ LINES="$(echo -e 'a\nb\nc' | wc -l)"; [[ "$LINES" -gt 0 ]] && echo 'at least one line'
at least one line
于 2012-06-19T15:38:27.533 回答