我试图检查一个符号链接是否存在bash。以下是我尝试过的方法。

mda=/usr/mda
if [ ! -L $mda ]; then
  echo "=> File doesn't exist"
fi


mda='/usr/mda'
if [ ! -L $mda ]; then
  echo "=> File doesn't exist"
fi

然而,这并不奏效。 如果”!'被省略,它永远不会触发。如果‘!’,它每次都会触发。


当前回答

这个文件真的是一个符号链接吗?如果不是,通常的存在性测试是-r或-e。

见人测试。

其他回答

使用readlink怎么样?

# if symlink, readlink returns not empty string (the symlink target)
# if string is not empty, test exits w/ 0 (normal)
#
# if non symlink, readlink returns empty string
# if string is empty, test exits w/ 1 (error)
simlink? () {
  test "$(readlink "${1}")";
}

FILE=/usr/mda

if simlink? "${FILE}"; then
  echo $FILE is a symlink
else
  echo $FILE is not a symlink
fi

这个文件真的是一个符号链接吗?如果不是,通常的存在性测试是-r或-e。

见人测试。

-L如果“文件”存在并且是一个符号链接(被链接的文件可能存在,也可能不存在),则返回true。你需要-f(如果文件存在并且是常规文件则返回true)或者-e(无论文件类型如何,如果文件存在则返回true)。

根据GNU手册,-h等同于-L,但根据BSD手册,它不应该被使用:

-h file如果file存在且为符号链接,则为True。此操作符被保留以与此程序的以前版本兼容。不要依赖它的存在;用-L代替。

首先你可以这样做: mda = " / usr / mda” 如果[!-L "${mda}"];然后 echo "=>文件不存在" fi 如果你想用更高级的风格,你可以这样写: #!/bin/bash mda = " $ 1 " If [-e "$1"];然后 如果[!-l "$1"] 然后 返回“您的条目不是符号链接” 其他的 返回“您的条目是符号链接” fi 其他的 echo "=>文件不存在" fi

上述结果如下:

root@linux:~# ./sym.sh /etc/passwd
you entry is not symlink
root@linux:~# ./sym.sh /usr/mda 
your entry is symlink
root@linux:~# ./sym.sh 
=> File doesn't exist

你可以用以下方法检查符号链接是否存在并且它没有被破坏:

[ -L ${my_link} ] && [ -e ${my_link} ]

所以,完整的解决方案是:

if [ -L ${my_link} ] ; then
   if [ -e ${my_link} ] ; then
      echo "Good link"
   else
      echo "Broken link"
   fi
elif [ -e ${my_link} ] ; then
   echo "Not a link"
else
   echo "Missing"
fi

-L测试是否有符号链接,断开与否。通过结合使用-e,可以测试链接是否有效(指向目录或文件的链接),而不仅仅是它是否存在。