我需要创建一个 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.txt
maketouch
仅更改“访问”和“更改”时间。
答案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
时执行-f
http://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 命令不会更改任何内容。