使用Shell检查文件是否存在,并且只有在存在时才执行一组命令

时间:2013-07-01 21:56:51

标签: shell stata

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

例如,可能存在以下内容并且可能:

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

我的意图是仅在文件insheet存在的情况下file.txt。我担心的是,如果我有insheet语句但文件不存在,程序会因语法错误而停止,失败,死亡或其他任何调用它。

2 个答案:

答案 0 :(得分:4)

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

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

  2. 完全不同的if命令只测试一次是否为真,看起来更合适。在实践中,它不用于此目的,但要了解更多信息,请参阅help ifcmd

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

  4. 但是,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 和/或选项,则由于其他原因可能会导致命令失败。因此,一般来说,检查文件是否存在似乎是一种更好的策略。

答案 1 :(得分:3)

confirm命令具有您正在寻找的内容。

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

或者,您可以在capture命令之前放置insheet,这将捕获语法错误。有关[{1}}和capture

的更多信息,请参阅[P]手册