如果文件不存在,则创建一个文件,并在该文件中写入0,否则不执行任何操作

时间:2019-02-03 15:53:51

标签: linux bash

在Bash中,我想检查文件是否存在,如果存在,则什么也不做。如果不是,请创建一个新文件,并在该新文件中写入“ 0”。

我编写了以下代码,问题是:此代码将覆盖现有文件。谁能告诉我哪里出问题了?我应该如何修改?

for r in FE C CR MN SI NI CO MO W NB AL P CU TA V B N O S
do
  if [ ! -f id1/data/T1_FCC_X_${r}.dat ]; then
    echo "0"  > data/T1_FCC_X_${r}.dat
  fi
done

1 个答案:

答案 0 :(得分:6)

您可以使用noclobber选项一键完成:

  

使用>>&<>防止输出重定向,以覆盖现有文件。

来自Redirecting Output section

  

如果重定向操作符为>,并且内置noclobber的{​​{1}}选项已启用,那么如果存在其名称由单词扩展产生的文件,则重定向将失败并且是常规文件。

所以这应该做:

set

如果文件存在,重定向将失败,并显示标准错误消息(并且文件不会被覆盖);这就是为什么我们将错误消息重定向到set -o noclobber # or, equivalently, set -C for r in FE C CR MN SI NI CO MO W NB AL P CU TA V B N O S; do echo "0" > "data/T1_FCC_X_$r.dat" done 2> /dev/null (在循环之后),以免污染标准错误流。

如果文件不存在,则将执行重定向,前提是您拥有创建此类文件的所有权利。

注意。您可能要在此之后取消设置/dev/nullnoclobber(或将所有内容都包含在子shell中)。