我想在我的bash脚本中的for
循环中使用命令替换,如下所示:
for file in `ls`; do
echo "$file"
tar xzvf "$file"
done
问题是在提取每个文件时,在下一次迭代中,ls将再次执行,因此for
循环将迭代新的集合。我决定在开始循环之前捕获ls
输出,并在循环中使用它:
files=`ls`
for file in ${files}; do
echo "$file"
tar xzvf "$file"
done
但看起来并没有运行ls
并将结果存储在$files
中,而是用ls
替换了${files}
,我现在的情况与我在第一个代码示例中的情况相同。
如何在files=ls
部分代码中强制外壳程序运行ls
命令?
更新
我在我的Ubuntu 16.04笔记本电脑上:
$ uname -a
Linux laptop 4.4.0-131-generic #157-Ubuntu SMP Thu Jul 12 15:51:36 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
和GNU bash, version 4.3.48(1)-release (x86_64-pc-linux-gnu)
我的主页中有一个名为test
的文件夹,其中包含两个简单的压缩文件和我的脚本:
test
├── a.tar.gz
├── b.tar.gz
└── script.sh
script.sh
内容:
#!/usr/bin/env bash
files=`ls`
for file in ${files}; do
echo "$file"
tar xzvf "$file"
done
下面是test
文件夹内部的bash -x script.sh
输出:
++ ls
+ files='a.tar.gz
b.tar.gz
script.sh'
+ for file in '${files}'
+ echo a.tar.gz
a.tar.gz
+ tar xzvf a.tar.gz
a
+ for file in '${files}'
+ echo b.tar.gz
b.tar.gz
+ tar xzvf b.tar.gz
b
+ for file in '${files}'
+ echo script.sh
script.sh
+ tar xzvf script.sh
gzip: stdin: not in gzip format
tar: Child returned status 1
tar: Error is not recoverable: exiting now
最后是bash script.sh
(手动删除解压文件后)输出:
a.tar.gz
a
b.tar.gz
b
script.sh
gzip: stdin: not in gzip format
tar: Child returned status 1
tar: Error is not recoverable: exiting now
感谢您的帮助和耐心。
发布于 2018-08-27 19:07:24
我似乎被tar
命令的输出搞糊涂了,因为在a.tar.gz
内部有一个名为a
的文件,b.tar.gz
的文件也是如此。
如下所示修改代码解决了这个问题:
files=`ls`
for file in ${files}; do
echo "$file"
tar xzvf "$file" &> /dev/null
done
发布于 2018-08-27 03:25:19
您的脚本不应该处理一个文件超过一次,并且它不会在相同的执行中获得tar x
的结果,除非重新运行。然而,这里有几个问题:
如果脚本重新运行,它将处理任何文件,而不仅仅是tar.gz文件错误检查。如果脚本重新运行,它将获取以前提取的结果,并且它还将重新处理以前展开的所有
因此,它可以用一种更好的方式来解决上述问题:
for zipfile in *.tar.gz; do
printf '%s\n' "Processing file '$zipfile'"
tar xzvf "$zipfile" && mv "$zipfile" "$zipfile.done"
if (($? == 0)); then
printf '%s\n' "$zipfile: success"
else
printf '%s\n' "$zipfile: failure"
fi
done
https://stackoverflow.com/questions/52029372
复制相似问题