我正在为一个项目制作一个模板 shell 脚本,一个必须的功能是能够将模板配置文件的副本制作为新文件。但是,这不会被静态处理,我创建并设置了一个来自 shell 脚本文件名的运行时变量( $modloader
),并将模板复制为同名。我用静态文件名做了一些测试并且cp
工作正常,但是在检查文件是否已经存在时似乎崩溃了(第 5 行)。如果我在终端中运行它,它不会看到它正在检查的文件。我相信它是在更字面的上下文中寻找它,并且不“理解”它正在使用变量。
#!/bin/sh
modloader=`basename -s .sh "$0"`
if "./Settings/$modloader.ini"; then
cp "./Settings/Template.ini" "./Settings/$modloader.ini"
fi
我没有看到您正在检查文件是否已经存在。您
if "./Settings/$modloader.ini";
尝试运行ini 文件。一般来说,如果文件被设计为像这样运行并根据您想要测试的内容返回退出状态,那么它可能是对某事的有效测试。即使可以运行有问题的文件,使该文件成为其自身(不)存在的测试器也是没有意义的。
在 shell 中判断文件是否存在的正确方法是:
笔记:
test -e
测试任何类型的文件。test -e
Settings
如果某些相关目录的权限(例如在您的情况下)不允许检查文件是否存在,或者这样会给您一个错误的否定(即非零退出状态) 。此外,您想否定测试。您的代码中的行将如下所示:
if
虽然没有必要。cp
带有-n
( ) 的GNU--no-clobber
可能就是您所需要的if … fi
。该选项不可移植,您很可能需要另一个不可移植选项-T
(--no-target-directory
),以防目标结果是(指向)目录的(符号链接)。请注意,如果目标已经存在并因此
cp -n
是空操作,则退出状态将为0
. 如果目标不存在且复制成功,您将获得相同的退出状态。这意味着如果您想cp
根据文件是否存在做更多(比),if
无论如何您都需要事先。