Bash shell脚本:如何验证函数是否返回1行文本?
我尝试通过以下许多功能生成csv文件:Bash shell脚本:如何验证函数是否返回1行文本?,bash,shell,ksh,Bash,Shell,Ksh,我尝试通过以下许多功能生成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
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
因此,如果有人对如何编写一个通用检查函数有好的想法,我会很高兴
谢谢您可以使用
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
您可以使用
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
如果您有GNUGREP,您可以通过grep-m1
简单地确保grep首先不会产生超过一行的输出。或者,使用sed'/sudo version/!Dq'
而不是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
shopt-s lastpipe#if bash
#ksh还是bash
验证_输出(){
($(T型钢>(wc-l)>&2)==1))
} 2>&1
#猛击
验证输出2(){
本地线路
tee/dev/fd/2 | mapfile-tc1-C'(++lines<2))| | return;:'
((行))
} 2>&1
获取| sudo |版本|验证|输出|回显失败
当然,这方面可能有很多变化。在我看来,这是毫无意义的,不应该用于这样的事情。只要设计你的get\u sudo\u版本
,这样它就能保证正确的结果。如果你有GNU grep,你可以简单地通过grep-m1
确保grep一开始不会产生多行输出。或者,使用sed'/sudo version/!Dq'
而不是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
shopt-s lastpipe#if bash
#ksh还是bash
验证_输出(){
($(T型钢>(wc-l)>&2)==1))
} 2>&1
#猛击
验证输出2(){
本地线路
tee/dev/fd/2 | mapfile-tc1-C'(++lines<2))| | return;:'
((行))
} 2>&1
获取| sudo |版本|验证|输出|回显失败
当然,这方面可能有很多变化。在我看来,这是毫无意义的,不应该用于这样的事情。只需设计您的
get\u sudo\u版本
,以确保获得正确的结果。谢谢,但如果我这样做,我将需要运行每个命令2次。如果可能的话,我希望避免这种情况。@AlainDejoux我真的看不出为什么您需要运行每个命令两次。我想你遗漏了一些简单的东西。谢谢,但如果我这样做,我将需要运行每个命令2次。如果可能的话,我希望避免这种情况。@AlainDejoux我真的看不出为什么您需要运行每个命令两次。我猜你错过了一些简单的东西。总是引用你的扩展<代码>回显“$mytest”非常感谢。我不知道这种行为。总是引用你的扩展<代码>回显“$mytest”非常感谢。我不知道这种行为,谢谢。你是对的,仅仅对于sudo版本来说这是没有意义的,但是我会有很多函数,有些是其他人提供的,所以有一个标准的方法来验证输出似乎是个好主意。谢谢。你是对的,仅仅对于sudo版本来说,这是毫无意义的,但是我会有很多其他人提供的函数,所以有一个标准的方法来验证输出似乎是个好主意。