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