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

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

但是,这是行不通的。 如果“!” 被排除在外,它从来没有触发。 而如果 '!' 在那里,每次都会触发。

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

根据GNU手册页 , -h-L相同,但根据BSD手册 ,不应使用:

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

-L是文件存在的testing, 也是一个符号链接

如果你不想testing这个文件是一个符号链接,只是testing它是否存在而不pipetypes(文件,目录,套接字等),那么使用-e

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

 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 

也许这是你在找什么。 检查文件是否存在并且不是链接。

试试这个命令:

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

你可以检查一个符号链接的存在,它不会被破坏:

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

所以,完整的解决scheme是:

 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 

文件是否真的是一个符号链接? 如果不是,通常的存在testing是-r-e

man test

如何使用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 

如果您正在testing文件存在,则需要-e不要-L。 -Ltesting一个符号链接。