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
Linux 循环命令、管道上一个命令';s输出_Linux_Bash_Shell - Fatal编程技术网

Linux 循环命令、管道上一个命令';s输出

Linux 循环命令、管道上一个命令';s输出,linux,bash,shell,Linux,Bash,Shell,我知道您可以在bash中使用循环来重复一定次数的命令,尽管在bash脚本中使用它更方便 例如,假设我有一个文件已经压缩了好几次,我希望完全解压缩它 cat file.txt | gzip -d | gzip -d | gzip -d 对于一个已经压缩了3次的文件来说,这已经足够实用了,但是如果该文件被压缩了,例如18次,它将变得非常笨拙。这怎么能简化呢?我想在前一个命令的输出上运行gzip-d命令n次。有没有一种方法可以从命令行执行?你可以沿着这些线做一些事情(原谅任何语法错误,考虑这个接近B

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

例如,假设我有一个文件已经压缩了好几次,我希望完全解压缩它

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

对于一个已经压缩了3次的文件来说,这已经足够实用了,但是如果该文件被压缩了,例如18次,它将变得非常笨拙。这怎么能简化呢?我想在前一个命令的输出上运行gzip-d命令n次。有没有一种方法可以从命令行执行?

你可以沿着这些线做一些事情(原谅任何语法错误,考虑这个接近BASH语法的伪代码):


你可以沿着这些线做任何事情(原谅任何语法错误,考虑这个接近BASH语法的伪代码):


如果您不记得或没有被告知文件压缩的频率,该怎么办? 您希望
gunzip
,直到它成为普通文件。
当您不想覆盖原始文件时,制作副本是最简单的:

tmpfile=/tmp/mightbegz
cp file.txt ${tmpfile}; 
while [ $? -eq 0 ]; do 
   echo "Gunzipping Again" 
   mv ${tmpfile} ${tmpfile}.gz
   gunzip -d ${tmpfile}.gz
done

gzip
无法
gunzip
文件时,while循环将停止。

如果您不记得或没有被告知文件压缩的频率,该怎么办? 您希望
gunzip
,直到它成为普通文件。
当您不想覆盖原始文件时,制作副本是最简单的:

tmpfile=/tmp/mightbegz
cp file.txt ${tmpfile}; 
while [ $? -eq 0 ]; do 
   echo "Gunzipping Again" 
   mv ${tmpfile} ${tmpfile}.gz
   gunzip -d ${tmpfile}.gz
done

gzip
无法
gunzip
文件时,while循环将停止。

也有这样做的原因吗?我猜你不想重复运行gzip,这只是一个例子?我用它作为例子,说明如何使用前一个命令的输出作为下一个命令的输入来运行命令n次。我想知道是否可以从命令行执行。是否有这样做的原因?我猜你不想重复运行gzip,这只是一个例子?我用它作为例子,说明如何使用前一个命令的输出作为下一个命令的输入来运行命令n次。我想知道是否可以从命令行执行。在第二个示例中,
then
语句应该引用
recursive\u-pipe
(没有足够的字符允许编辑)@interoper感谢您捕捉到了这一点,现在更正了。在第二个示例中,
then
语句应该引用
recursive\u-pipe
(没有足够的字符允许编辑)@INTEROPER感谢您捕捉到这一点,现在更正。
tmpfile=/tmp/mightbegz
cp file.txt ${tmpfile}; 
while [ $? -eq 0 ]; do 
   echo "Gunzipping Again" 
   mv ${tmpfile} ${tmpfile}.gz
   gunzip -d ${tmpfile}.gz
done