1

私はそのような多くの関数を介してcsvファイルを生成しようとします:

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

上記の関数は簡単な例ですが、出力が正しいかどうかわからない場合があります。1つのテキスト行のみを返す関数を検証するための最良の方法を知りたいです。

そんなことを考えました

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

mytest="val1
err2
err3"

しかし、変数がretrun行の文字を保持していないため、明らかに機能していません。

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 に答える