首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在bash脚本中强制执行命令

如何在bash脚本中强制执行命令
EN

Stack Overflow用户
提问于 2018-08-27 02:56:23
回答 2查看 2K关注 0票数 1

我想在我的bash脚本中的for循环中使用命令替换,如下所示:

代码语言:javascript
复制
  for file in `ls`; do
    echo "$file"
    tar xzvf "$file"
  done

问题是在提取每个文件时,在下一次迭代中,ls将再次执行,因此for循环将迭代新的集合。我决定在开始循环之前捕获ls输出,并在循环中使用它:

代码语言:javascript
复制
  files=`ls`
  for file in ${files}; do
    echo "$file"
    tar xzvf "$file"
  done

但看起来并没有运行ls并将结果存储在$files中,而是用ls替换了${files},我现在的情况与我在第一个代码示例中的情况相同。

如何在files=ls部分代码中强制外壳程序运行ls命令?

更新

我在我的Ubuntu 16.04笔记本电脑上:

代码语言:javascript
复制
$ 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的文件夹,其中包含两个简单的压缩文件和我的脚本:

代码语言:javascript
复制
test
├── a.tar.gz
├── b.tar.gz
└── script.sh

script.sh内容:

代码语言:javascript
复制
#!/usr/bin/env bash

  files=`ls`
  for file in ${files}; do
    echo "$file"
    tar xzvf "$file"
  done

下面是test文件夹内部的bash -x script.sh输出:

代码语言:javascript
复制
++ 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 (手动删除解压文件后)输出:

代码语言:javascript
复制
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

感谢您的帮助和耐心。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-08-27 19:07:24

我似乎被tar命令的输出搞糊涂了,因为在a.tar.gz内部有一个名为a的文件,b.tar.gz的文件也是如此。

如下所示修改代码解决了这个问题:

代码语言:javascript
复制
  files=`ls`
  for file in ${files}; do
    echo "$file"
    tar xzvf "$file" &> /dev/null
  done
票数 0
EN

Stack Overflow用户

发布于 2018-08-27 03:25:19

您的脚本不应该处理一个文件超过一次,并且它不会在相同的执行中获得tar x的结果,除非重新运行。然而,这里有几个问题:

如果脚本重新运行,它将处理任何文件,而不仅仅是tar.gz文件错误检查。如果脚本重新运行,它将获取以前提取的结果,并且它还将重新处理以前展开的所有

  • 文件如果其中有空格,它将失败(请参见ParsingLs)

  • there is

  • tar.gz

  • 以查看提取是否成功

因此,它可以用一种更好的方式来解决上述问题:

代码语言:javascript
复制
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
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52029372

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档