如何在Bash中测试文件或符号链接的存在,甚至是损坏的文件或符号链接?

如何在Bash中测试文件或符号链接的存在,甚至是损坏的文件或符号链接?,bash,Bash,在Bash中,我想说,“如果存在~/.gitconfig,那么做一些事情”,但是很难找到正确的条件。我需要解释普通文件、有效符号链接和断开的符号链接 我尝试过但不起作用的事情: if[[-L“$HOME/.gitconfig”]–当.gitconfig是普通文件时,返回false if[[-e“$HOME/.gitconfig”]-当.gitconfig存在但符号链接已断开时,返回false 是否有一个开关可以做我想要的,或者我需要提出一个更复杂的条件 更新:我删除了删除文件的内容,我只对条

在Bash中,我想说,“如果存在
~/.gitconfig
,那么做一些事情”
,但是很难找到正确的条件。我需要解释普通文件、有效符号链接和断开的符号链接

我尝试过但不起作用的事情:

  • if[[-L“$HOME/.gitconfig”]
    –当
    .gitconfig
    是普通文件时,返回false
  • if[[-e“$HOME/.gitconfig”]
    -当
    .gitconfig
    存在但符号链接已断开时,返回false
是否有一个开关可以做我想要的,或者我需要提出一个更复杂的条件


更新:我删除了删除文件的内容,我只对条件感兴趣,而不是之后发生的操作。

此条件满足我的需要(尽管如果存在,我仍然希望使用单个开关/测试):

file=“$HOME/.gitconfig”
如果[-e$file | |-L$file]];然后
echo“文件存在”
fi

此条件满足我的需要(尽管如果存在,我仍然希望使用单个开关/测试):

file=“$HOME/.gitconfig”
如果[-e$file | |-L$file]];然后
echo“文件存在”
fi

我通常使用-s,因为在操作文件列表时,我会将列表发送到一个文件中,并使用ed重复从文件中拉出第一行。只有当文件长度不为零时,-s开关才为真,这意味着一旦我删除了每一行,循环就会停止。

我通常使用-s,因为在处理文件列表时,我会将列表发送到一个文件中,并使用ed反复从文件中拉出第一行。只有当文件长度不为零时,-s开关才为真,这意味着一旦我删除了每一行,循环就会停止。

也许您正在寻找的是readlink

$ readlink /tmp/link; echo $?
below cmd output started 2020 Fri Mar 27 08:00:38 AM PDT
/tmp/notthere
0
above cmd output done    2020 Fri Mar 27 08:00:38 AM PDT
dstromberg@dstromberg-inspiron-5570:~ x86_64-pc-linux-gnu 4291

$ readlink /etc/passwd; echo $?
below cmd output started 2020 Fri Mar 27 08:00:46 AM PDT
1
above cmd output done    2020 Fri Mar 27 08:00:46 AM PDT
dstromberg@dstromberg-inspiron-5570:~ x86_64-pc-linux-gnu 4291

$ readlink /tmp/nonexistent; echo $?
below cmd output started 2020 Fri Mar 27 08:00:56 AM PDT
1

HTH

也许您正在寻找的是readlink

$ readlink /tmp/link; echo $?
below cmd output started 2020 Fri Mar 27 08:00:38 AM PDT
/tmp/notthere
0
above cmd output done    2020 Fri Mar 27 08:00:38 AM PDT
dstromberg@dstromberg-inspiron-5570:~ x86_64-pc-linux-gnu 4291

$ readlink /etc/passwd; echo $?
below cmd output started 2020 Fri Mar 27 08:00:46 AM PDT
1
above cmd output done    2020 Fri Mar 27 08:00:46 AM PDT
dstromberg@dstromberg-inspiron-5570:~ x86_64-pc-linux-gnu 4291

$ readlink /tmp/nonexistent; echo $?
below cmd output started 2020 Fri Mar 27 08:00:56 AM PDT
1

HTH

if[-L“$HOME/.gitconfig”&&!-e“$HOME/.gitconfig”];然后echo“$HOME/.gitconfig”是一个悬挂的符号链接;fi
@chepner我删除了关于删除文件的提及,我实际上需要在IF块中做更复杂的事情,对此表示抱歉。
IF[[-L“$HOME/.gitconfig”&&!-e“$HOME/.gitconfig”];然后echo“$HOME/.gitconfig”是一个悬挂的符号链接”;fi
@chepner我删除了删除文件的内容,我实际上需要在IF块中执行更复杂的操作,对此表示抱歉。您应该拆分并反转条件:
IF test-L“$file”| test-e“$file”
<代码>测试不会在第一次匹配时中止,而是评估每个条件。在
stat()
之前执行
lstat()
-L
)可能更方便选择…您应该拆分并反转条件:
如果test-L“$file”| test-e“$file”
<代码>测试不会在第一次匹配时中止,而是评估每个条件。在
stat()
之前执行
lstat()
-L
)可能更方便选择。。。