Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash shell脚本:如何验证函数是否返回1行文本?_Bash_Shell_Ksh - Fatal编程技术网

Bash shell脚本:如何验证函数是否返回1行文本?

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

我尝试通过以下许多功能生成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"
但它显然不起作用,因为变量没有保留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版本来说,这是毫无意义的,但是我会有很多其他人提供的函数,所以有一个标准的方法来验证输出似乎是个好主意。