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

jrw*_*jrw 41 osx bash shell-script

我需要创建一个 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 ...
Run Code Online (Sandbox Code Playgroud)

回报是

line 5: [!: command not found
mkdir: /Scripts: File exists
Run Code Online (Sandbox Code Playgroud)

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

xen*_*oid 60

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

mkdir -p /Scripts
touch /Scripts/file.txt
Run Code Online (Sandbox Code Playgroud)

如果你不希望的现有的“修改”时间file.txt被改变touch,你可以用touch -a /Scripts/file.txttouch只改变“准入”和“变”时代。

  • 如果你不关心 mtime,你可以使用 `>>/Scripts/file.txt`。这将打开文件进行追加,如果它不存在则创建它。 (3认同)

jes*_*e_b 36

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

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

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

[command2]
Run Code Online (Sandbox Code Playgroud)

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

  • @Ant: mkdir -p :创建所有必要的目录,如果一个目录已经存在,不要抱怨。例如: mkdir /home/user1/tmp :将创建此层次结构,与 /home 或 /home/user1 目录预先存在的事实无关。touch 也只会更新现有文件的时间,如果不存在文件,则创建一个新文件。甚至可以去掉 if ... then 部分,因为只要启动这 2 个命令就可以了,如果您想确保这些目录存在并且该文件存在于其中。 (3认同)

Jam*_*den 21

首先,shell script不是bash script,所以让我们让你的代码更通用:

#!/bin/sh
Run Code Online (Sandbox Code Playgroud)

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

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

dir=/Scripts
mkdir -p $dir
Run Code Online (Sandbox Code Playgroud)

如果文件不存在,则创建文件,

filename=$dir/file.txt
test -f $filename || touch $filename
Run Code Online (Sandbox Code Playgroud)

或者,如果您愿意,

filename=$dir/file.txt
if [ ! -f $filename ]
then
    touch $filename
fi
Run Code Online (Sandbox Code Playgroud)


Dop*_*oti 6

你有一个语法错误。你空格前后的需要[]