2012-06-19 86 views
1

我嘗試過很多功能一樣,生成CSV文件:以上shell腳本:如何驗證函數返回1文本行?

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" 

但它顯然不工作,因爲變量不守retrun行字符:

echo $mytest 
val1 err2 err3 

所以,如果有人有我怎麼一個好主意可以提供一個通用檢查功能,我會很高興。

感謝

+1

總是引用你的擴展。 '回聲「$ mytest」' – jordanm

+0

非常感謝。我不知道這種行爲。 –

回答

1

如果你有GNU的grep,你可以簡單保證的grep不產生輸出的多行第一通過放置。或者,使用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 

對可能的,當然許多變化。海事組織這是非常毫無意義,不應該用於這樣的事情。只需設計您的get_sudo_version,以保證獲得正確的結果。

+0

謝謝。你是對的,對於sudo版本而言,這是毫無意義的,但我會有很多其他人提供的功能,所以有一個標準的方法來驗證輸出似乎是一個好主意。 –

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 
+0

謝謝,但如果我這樣做,我將需要運行每個命令2次。如果可能的話,我想避免這種情況。 –

+0

@AlainDejoux我真的沒有看到爲什麼你需要運行每個命令兩次。我想你錯過了一些簡單的事情。 – KurzedMetal