我知道您可以在 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/