Bash 了解脚本以检查文件是否存在

Bash 了解脚本以检查文件是否存在,bash,file,unix,Bash,File,Unix,我使用以下命令检查文件是否存在,如果不可用,则创建它: if test "${LOG_FILE:=}x" != "x"; then touch $LOGAP exit_code=$? fi 请帮助我理解这个脚本,测试条件如何“${LOG\u FILE:=}x”!=“x”用于检查是否存在EXIXT。我正在使用bashshell。基本思想 脚本检查是否设置了$LOG\u FILE变量。如果是,它将接触存储在$LOGAP中的文件名 解释 让我们把它分开: test == if 所以

我使用以下命令检查文件是否存在,如果不可用,则创建它:

if test "${LOG_FILE:=}x" != "x"; then
    touch $LOGAP
    exit_code=$?
fi

请帮助我理解这个脚本,测试条件如何
“${LOG\u FILE:=}x”!=“x”
用于检查是否存在EXIXT。我正在使用bashshell。

基本思想
脚本检查是否设置了
$LOG\u FILE
变量。如果是,它将接触存储在
$LOGAP
中的文件名

解释
让我们把它分开:

test == if
所以

if [ "${LOG_FILE:=}x" != "x" ]; then
让我们做一个测试:

LOG_FILE="FILE_TEST"
echo "${LOG_FILE:=}x"
将输出

FILE_TESTx
因此,它所做的是检查变量
LOG\u FILE
是否被设置。如果设置了

[ "${LOG_FILE:=}x" != "x" ]
[ "${LOG_FILE:=}x" != "x" ]
将是

[ "FILE_TESTx" != "x" ]
[ "x" != "x" ]
这是真的

如果未设置日志文件

将是

[ "FILE_TESTx" != "x" ]
[ "x" != "x" ]
这是错误的

也就是说,
x
是一个开始。你可以把它改成

[ "${LOG_FILE:=}HELLO_MY_NAME_IS_BLABLA" != "HELLO_MY_NAME_IS_BLABLA" ]
最后,你有一个

touch $LOGAP
这将
触摸
(如果未创建文件,则创建文件,如果已存在,则更新修改日期)。它还需要设置变量
$LOGAP


必须指出,检查文件是否存在的最快方法是:

if [ ! -f /tmp/foo.txt ]; then
 ...
fi

基本理念
脚本检查是否设置了
$LOG\u FILE
变量。如果是,它将接触存储在
$LOGAP
中的文件名

解释
让我们把它分开:

test == if
所以

if [ "${LOG_FILE:=}x" != "x" ]; then
让我们做一个测试:

LOG_FILE="FILE_TEST"
echo "${LOG_FILE:=}x"
将输出

FILE_TESTx
因此,它所做的是检查变量
LOG\u FILE
是否被设置。如果设置了

[ "${LOG_FILE:=}x" != "x" ]
[ "${LOG_FILE:=}x" != "x" ]
将是

[ "FILE_TESTx" != "x" ]
[ "x" != "x" ]
这是真的

如果未设置日志文件

将是

[ "FILE_TESTx" != "x" ]
[ "x" != "x" ]
这是错误的

也就是说,
x
是一个开始。你可以把它改成

[ "${LOG_FILE:=}HELLO_MY_NAME_IS_BLABLA" != "HELLO_MY_NAME_IS_BLABLA" ]
最后,你有一个

touch $LOGAP
这将
触摸
(如果未创建文件,则创建文件,如果已存在,则更新修改日期)。它还需要设置变量
$LOGAP


必须指出,检查文件是否存在的最快方法是:

if [ ! -f /tmp/foo.txt ]; then
 ...
fi

你在用什么外壳?@easterbunny,它是bash shell你在用什么外壳?@easterbunny,它是bash shell非常感谢!我在讨论中提到的命令和带有-f选项的if命令之间有什么区别吗?它们只是替代解决方案。我是否可以每次使用带有-f选项的if命令来检查文件是否存在?我强烈建议您使用
if[-f file]
。您发布的版本只是检查变量是否已定义,而不管它们指示的文件是什么。此外,当您确实需要测试变量以查看它是否已设置且不为空时,最好是
[-n“$variable”]
(或者确保它为空
[-z“$variable”]
)。如果您想测试即使变量设置为空也是否设置了该变量,这是可行的:
[-n“${variable+set}”]
${variable+set}
如果变量设置为空,则扩展为单词“set”;如果变量未设置,则根本没有任何内容-+发挥了神奇的作用,字符串“set”是任意的,您可以使用任何东西。如果您将+替换为:+,那么变量必须设置为非空。)非常感谢!我在讨论中提到的命令和带有-f选项的if命令之间有什么区别吗?它们只是替代解决方案。我是否可以每次使用带有-f选项的if命令来检查文件是否存在?我强烈建议您使用
if[-f file]
。您发布的版本只是检查变量是否已定义,而不管它们指示的文件是什么。此外,当您确实需要测试变量以查看它是否已设置且不为空时,最好是
[-n“$variable”]
(或者确保它为空
[-z“$variable”]
)。如果您想测试即使变量设置为空也是否设置了该变量,这是可行的:
[-n“${variable+set}”]
${variable+set}
如果变量设置为空,则扩展为单词“set”;如果变量未设置,则根本没有任何内容-+发挥了神奇的作用,字符串“set”是任意的,您可以使用任何东西。如果将+替换为:+,则变量必须设置为非空。)