purpose: find dead symlinks and output them quoted
1 [ $# -eq 0 ] && directorys=`pwd` || directorys=$@ 2 3 linkchk () { 4 for element in $1/*; do 5 [ -h "$element" -a ! -e "$element" ] && echo \"$element\" 6 [ -d "$element" ] && linkchk $element 7 # Of course, '-h' tests for symbolic link, '-d' for directory. 8 done 9 } 10 11 for directory in $directorys; do 12 if [ -d $directory ] 13 then linkchk $directory 14 else 15 echo "$directory is not a directory" 16 echo "Usage: $0 dir1 dir2 ..." 17 fi 18 done 19 exit $?
这是一个测试死链接的脚本,我不能立即第5行:
[ -h "$element" -a ! -e "$element" ] && echo \"$element\"
-h 判断一个链接是否为符号链接,既然-h "$element"成立,说明这个符号链接是存在的,后面为什么又要与上! -e "$element“,同一个参数为什么前面判断它存在,后面又判断它不存在呢?这不是自相矛盾吗?
经过一番仔细查看,发现符号链接文件在原文件被删除的情况下,符号链接文件的属性是存在的(-h "$element" ,但是其内容(它的值,比如cat "$selemnt" )是不存在的,所以满足[ -h "$selemnt" -a ! -e "$selemnt" ]即属性存在并且值不存在的情况