Answers:
-L
如果“文件”存在并且是符号链接(链接的文件可能存在或不存在),则返回true。您想要-f
(如果文件存在并且是常规文件,则返回true),或者只是-e
(如果文件存在而与类型无关,则返回true)。
根据GNU手册页,-h
与相同-L
,但根据BSD手册页,不应使用:
-h file
如果文件存在且为符号链接,则为True。保留该运算符是为了与该程序的早期版本兼容。不要依靠它的存在;使用-L代替。
!
是if ! [ -L $mda ]; then .... fi
将感叹号放在方括号之外。
if [ ! -L "$mda" ]; then ... fi
(注:if [ ! ... ]
和if ! [ ... ]
相同:)
-L是文件是否存在的测试,也是符号链接
如果您不想测试文件是否为符号链接,而只是测试它是否存在而不论类型(文件,目录,套接字等),则可以使用-e
因此,如果file是真正的文件,而不仅仅是符号链接,则可以执行所有这些测试并获得退出状态,该退出状态的值表示错误情况。
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
-e "${file}"
如果符号链接存在但其目标不存在,则失败。
您可以检查符号链接是否存在,并且没有被破坏:
[ -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
使用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
如果要测试文件是否存在,则需要-e而不是-L。-L测试符号链接。
首先,您可以使用以下样式:
mda="/usr/mda"
if [ ! -L "${mda}" ]; then
echo "=> File doesn't exist"
fi
如果您想以更高级的风格进行操作,可以如下所示:
#!/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
上面的结果是这样的:
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