如果文件不存在,shell 脚本会创建一个文件吗?

如果文件不存在,shell 脚本会创建一个文件吗?

我需要创建一个 shell 脚本来检查文件是否存在,如果不存在,则创建它并继续执行下一个命令,或者只是继续执行下一个命令。我所拥有的并不能做到这一点。

#!/bin/bash

# Check for the file that gets created when the script successfully finishes.
if [! -f /Scripts/file.txt]
then
: # Do nothing. Go to the next step?
else
mkdir /Scripts # file.txt will come at the end of the script
fi

# Next command (macOS preference setting)
defaults write ...

返回的是

line 5: [!: command not found
mkdir: /Scripts: File exists

不知道该怎么办。谷歌搜索给我带来的每个地方都表明了不同的东西。

答案1

可能更简单的解决方案,无需进行显式测试,只需使用:

mkdir -p /Scripts
touch /Scripts/file.txt

如果您不希望file.txt更改现有的“修改”时间touch,则可以使用touch -a /Scripts/file.txtmaketouch仅更改“访问”和“更改”时间。

答案2

您收到错误是因为之间没有空格[!但是您的代码中也存在一些缺陷。首先,您检查该文件是否不存在,如果不存在,则什么也不做。如果该文件确实存在,则您正在创建一个目录(但不执行任何操作来创建该文件)。

您也不需要 null 操作,您应该能够简单地执行以下操作:

#! /bin/bash -
if [[ ! -e /Scripts/file.txt ]]; then
    mkdir -p /Scripts
    touch /Scripts/file.txt
fi

[command2]

这是检查是否/Scripts/file.txt不存在,它将创建/Scripts目录,然后创建file.txt文件。如果需要,您还可以单独检查该目录是否存在。另外请注意,我正在使用-e而不是按照-f您的要求简单地检查文件是否存在,这将在检查它是否是“常规文件”-e时执行-fhttp://tldp.org/LDP/abs/html/fto.html

答案3

首先,外壳脚本不是bash脚本,让我们让您的代码更加通用:

#!/bin/sh

每个 Posix 系统都必须有该文件; bash 是严格可选的。

无需测试目录是否存在,只需

dir=/Scripts
mkdir -p $dir

要创建该文件(如果该文件不存在),

filename=$dir/file.txt
test -f $filename || touch $filename

或者如果你愿意的话,

filename=$dir/file.txt
if [ ! -f $filename ]
then
    touch $filename
fi

答案4

#!/bin/bash

# Check for the file that gets created when the script successfully finishes.
CHECKFILE="/Scripts/file.txt"

CHECKDIR=$( dirname "$CHECKFILE" )

# The directory with the file must exist
mkdir -p "$CHECKDIR"
if [ ! -f "$CHECKFILE" ]; then
    # What to do if the file is not there
fi
touch "$CHECKFILE"

上面假设没有“技巧”,例如创建一个目录称为/Scripts/file.txt(其中可以是强制脚本始终进入 if 分支的一种方法)。如果“文件”是目录,则 -f 测试将失败,并且 touch 命令不会更改任何内容。

相关内容