如何检查符号链接是否存在

我试图检查一个符号链接是否存在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

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

.

.
376847 次浏览

如果你测试文件是否存在,你需要-e而不是-L。-L测试符号链接。

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

看到man test

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

根据GNU从-h-L相同,但根据BSD从,它不应该被使用:

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

也许这就是你要找的。检查一个文件是否存在而不是一个链接。

试试这个命令:

file="/usr/mda"
[ -f $file ] && [ ! -L $file ] && echo "$file exists and is not a symlink"

-L是测试文件是否存在,是一个符号链接

如果你不想测试文件是否是符号链接,而只是测试它是否存在,不管它是什么类型(文件、目录、套接字等),那么使用-e

所以如果文件是真正的文件,而不仅仅是一个符号链接,你可以做所有这些测试 获取一个退出状态,其值指示错误条件

if [ ! \( -e "${file}" \) ]
then
echo "%ERROR: file ${file} does not exist!" >&2
exit 1
elif [ ! \( -f "${file}" \) ]
then
echo "%ERROR: ${file} is not a file!" >&2
exit 2
elif [ ! \( -r "${file}" \) ]
then
echo "%ERROR: file ${file} is not readable!" >&2
exit 3
elif [ ! \( -s "${file}" \) ]
then
echo "%ERROR: file ${file} is empty!" >&2
exit 4
fi

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

[ -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,你可以测试链接是否有效(指向目录或文件的链接),而不仅仅是它是否存在。

使用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
  1. 首先你可以这样做:

    mda="/usr/mda"
    if [ ! -L "${mda}" ]; then
    echo "=> File doesn't exist"
    fi
    
  2. if you want to do it in more advanced style you can write it like below:

    #!/bin/bash
    mda="$1"
    if [ -e "$1" ]; then
    if [ ! -L "$1" ]
    then
    echo "you entry is not symlink"
    else
    echo "your entry is symlink"
    fi
    else
    echo "=> File doesn't exist"
    fi
    

the result of above is like:

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