linux - 循环命令,通过管道传递前一个命令的输出

标签 linux bash shell

我知道您可以在 bash 中使用循环将命令重复一定次数,尽管在 bash 脚本中使用它更方便。

例如,假设我有一个文件被多次压缩,我想完全解压它。

cat file.txt | gzip -d | gzip -d | gzip -d

这对于压缩了 3 次的文件来说已经足够实用了,但是如果文件被压缩了,例如 18 次,它就会变得笨拙。这怎么能简化呢?我想对前一个命令的输出运行 gzip -d 命令 n 次。有没有办法从命令行执行此操作?

最佳答案

你可以按照这些行来做(请原谅任何语法错误,考虑这个伪代码接近 bash 语法):

#!/bin/bash
# $1 = iterations left
# $2 = final output file
recursive_gzip()
{
  if
    [[ "$1" -gt 0 ]]
  then
    gzip -d | recursive_gzip $(($1 - 1)) "$2"
  else
    gzip -d > "$2"
  fi
}

recursive_gzip 18 "file.txt" <"file.txt.gz"

请注意,我用重定向替换了你的 cat

您可以推广为压缩/解压缩共享相同函数的想法,并通过将它用作 2 之后的位置参数来实际使其适用于任意命令。

#!/bin/bash
# $1 = iterations left
# $2 = final output file
recursive_pipe()
{
  if
    [[ "$1" -gt 0 ]]
  then
    "${@:3}" | recursive_pipe $(($1 - 1)) "$2" "${@:3}"
  else
    "${@:3}" > "$2"
  fi
}

# Create gzipped file
recursive_pipe 18 "file.txt.gz" gzip <"file.txt"

# Uncompress gzipped file
recursive_pipe 18 "file.txt" gzip -d <"file.txt.gz"

关于linux - 循环命令,通过管道传递前一个命令的输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41926035/

相关文章:

linux - 如何使用shell脚本读取数组中的文件内容?

php - jquery 类型错误 : Response is null

php - 发送 POST 请求 wget

bash - ${var?} 中的 bash 变量参数扩展中的问号是什么意思?

linux - bash 空变量命令替换导致单引号

python - 有没有简单的方法来对 Python 脚本进行基准测试?

python - 无法在 django shell python 中导入 readline

php - 将 PHP 与 Linux 服务器上的 Paradox .db 文件连接

bash - 如何使用带有换行符的大括号扩展

shell - 如何检测前台进程正在等待 UNIX 中的输入?