如果输入不正好有 1 行,则返回错误,否则将输入传送到下一步

mus*_*oom 5 bash shell sh

我有一系列用管道链接在一起的命令:

should_create_one_line | expects_one_line

第一个命令should_create_one_line应该生成只有一行的输出,但在奇怪的情况下,输出可能是多行或空。

我想在这两者之间添加一个步骤validate_one_line

should_create_one_line | validate_one_line | expects_one_line

如果其输入恰好包含 1 行,validate_one_line则将简单地输出其输入。如果其输入包含多于 1 行或为空,validate_one_line则应导致整个步骤序列停止并返回错误代码。

我可以使用什么命令validate_one_line

koj*_*iro 4

使用read。这是一个符合您的规格的 shell 函数:

exactly_one_line() {
    local line # Use to echo the line
    read -r line || return # Guarantee at least one line is read
    read && return 1 # Indicate failure if another line is successfully read
    echo "$line"
}
Run Code Online (Sandbox Code Playgroud)

笔记

  1. “一行”假定一行后跟一个换行符。如果您的输入可能类似于包含内容但没有换行符的文件,那么这将失败。
  2. 给定像 这样的管道a|ba无法阻止b运行。至少,b需要处理a不产生输出的情况。

演示:

$ wc -l empty oneline twolines 
       0 empty
       1 oneline
       2 twolines
       3 total
$ exactly_one_line < empty; echo $?
1
$ exactly_one_line < oneline; echo $?
oneline
0
$ exactly_one_line < twolines; echo $?
1
Run Code Online (Sandbox Code Playgroud)