linux - Bash 从 stdout 获取最后一行(组合)

标签 linux bash shell

我有一个脚本可以执行许多不同的操作并以清晰的方式向用户显示它们的完成状态。我需要一个函数,以便可以检索一些字符串作为变量以供进一步处理。 这是一个高度简化的示例:

#!/bin/bash

echo "Test script."
echo -n "1) cat file "
cat ./testfile.f &> /dev/null
if [ $? -eq 0 ]
then
    echo "$(tput hpa $(tput cols))$(tput cub 8)[OK]"
else
    echo "$(tput hpa $(tput cols))$(tput cub 8)[FAIL]"
fi
echo -n "2) make subfolder "
mkdir ./testdir &> /dev/null
if [ $? -eq 0 ]
then
    echo "$(tput hpa $(tput cols))$(tput cub 8)[OK]"
else
    echo "$(tput hpa $(tput cols))$(tput cub 8)[FAIL]"
fi

它需要一些作为:

$./test.sh
Test script.
1) cat file                               [FAIL]
2) make subfolder                         [OK]

如何在脚本执行期间获取最后一行(最好是任何字符串)?理想情况下,它会使用一个函数(这样我就可以处理结果字符串)这个字符串将在同一个脚本中处理。 到目前为止,我只看到一种解决方案:使用 tee 重定向每个 echo 命令的输出。

有没有办法读取已经输出的数据!?

最佳答案

假设您有需要处理的字符串 {1..5}:

process() {
   while read -r input; do
      sleep 2
      echo "Processed ${input}."
   done
}

printf "line %s\n" {1..5} | process

在这种情况下,您可能希望在处理数字之前查看数字。
您可以通过将 stdout 复制到 fd 3 并使用一个函数来做到这一点。

display() {
   while read -r input; do
      echo "=== ${input} ===" >&3
      echo "${input}"
   done
}

process() {
   while read -r input; do
      sleep 2
      echo "Processed ${input}."
   done
}

exec 3>&1
printf "line %s\n" {1..5} | display | process

关于linux - Bash 从 stdout 获取最后一行(组合),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55651463/

相关文章:

mysql - 需要 'LOAD DATA INFILE' 的指导

linux - 如何在 while 循环中实现 IF 语句,并保持 while 循环无限期运行? ( bash )

linux - 如何通过虚拟接口(interface)发送请求

c - 程序卡在管道上(exec ls grep sort)

linux - 禁用挂起脚本

python - 单击 python 我如何从命令行读取 json 之类的参数

linux - 在每一行上使用 nslookup 并插入到特定列中

java - 如何通过 Jenkins 中的 Shell 脚本运行 TestNG.xml?

bash - 当 "set -x"时,Bash 中 stderr 中 + 号的数量是什么意思

linux - Bash 陷阱从函数中取消设置