【问题标题】:Using Shell to Check Whether a File Exists, and only if it does, Execute a Set of Commands使用 Shell 检查文件是否存在,只有存在,才执行一组命令
【发布时间】:2013-07-01 21:56:50
【问题描述】:

我在 Stata 中有几行代码。我希望仅当行所引用的 .txt 文件先验存在时才执行这些行。我想知道是否有一个可以用于此的 shell 命令,我可以将它嵌入到 if 语句中。

例如,可能存在并可能出现以下情况:

 insheet using "file.txt" if ('file.txt')

我的意图是说 insheet 文件 file.txt 仅当它存在时。我担心的是,如果我有 insheet 语句但文件不存在,程序会因为语法错误而停止、失败、死亡或任何你称之为的东西。

【问题讨论】:

    标签: shell stata


    【解决方案1】:

    立即回答是否定的。出于多种原因,没有类似的语法。

    1. if 限定符分别测试每个观察的某些条件是否为真,并且文件是否存在不是通过观察测试观察的合适条件。

    2. 完全不同的if 命令只测试一次,是否某事是真实的并且可能看起来更合适。实际上,它不用于此目的,但要了解更多信息,请参阅help ifcmd

    3. Stata 没有基于成对相同单引号 ' ' 的特殊语法。

    不过,Stata 在这里提供了一个单独的构造

    confirm file file.txt 
    

    实际上,只要文件不存在且文件不存在,就会停止执行文件或程序。捕获错误的一般方案类似于

    capture confirm file file.txt 
    if _rc == 0 insheet using file.txt 
    else { 
        <code if the file does not exist> 
    } 
    

    capture 被认为是吃掉confirm 命令的返回码。一般来说,任何命令的返回码_rc 如果命令有效并执行,则返回代码为 0,否则返回非零值。有时会测试特定的非零代码。实验表明file not found是返回码601。查找错误码(在[P]错误中)的主要原因是为了传递官方的错误信息,但在实践中知道零/非零规则是主要细节在这个标题下。

    这里的示例使用== 来测试是否相等。

    请注意,如果文件不存在,insheet using file.txt 并不是严格意义上的语法错误。就 Stata 的语言而言,这是合法的语法。然而,这是一个很好的区别:这是一个普通意义上的错误。

    (稍后)可能会短路整个过程

     capture insheet using file.txt 
     if _rc != 0 { 
          <code if the file does not exist>
     }
    

    在这种情况下,文件不存在是insheet 命令失败的假定解释。但是,如果 insheet 调用更复杂,带有 varlist 和/或选项,则可能由于其他原因导致命令失败。所以一般来说,分离出文件是否存在的检查似乎是一个更好的策略。

    【讨论】:

      【解决方案2】:

      confirm 命令有您要查找的内容。

      capture confirm file "file.txt"
      if !_rc {  # if the file exists, confirm will return error code 0
          insheet using "file.txt"
      }
      

      或者,您可以在insheet 命令之前放置一个capture,这将捕获语法错误。有关captureconfirm 的更多信息,请查看[P] 手册。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-02-06
        • 1970-01-01
        • 2019-12-08
        • 1970-01-01
        • 2016-04-15
        • 2014-11-06
        • 1970-01-01
        相关资源
        最近更新 更多