如果文件不存在则通过变量复制文件

如果文件不存在则通过变量复制文件

我正在为一个项目制作一个模板 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 -eSettings或者如果某些相关目录(例如,在您的情况下)的权限不允许检查该文件是否存在,那么将会给您一个假阴性(即非零退出状态) 。

另外,你还想否定测试。代码中的行将如下所示:

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

相关内容