第一部分 If的用法
第一种 
if list then 
  do something here 
fi 
当list表述返回值为True(0)时,将会执行"do something here"。
#!/bin/sh
myPath="/var/log/httpd/"
myFile="/var /log/httpd/access.log"
1. 是否存在并且是否具有可执行权限
#这里的-x 参数判断$myPath
if [ ! -x "$myPath"]; then
  mkdir "$myPath"
fi
2. 目录是否存在
#这里的-d 参数判断$myPath是否存在
if [ ! -d "$myPath"]; then
  mkdir "$myPath"
fi
3. 文件是否存在
#这里的-f参数判断$myFile是否存在
if [ ! -f "$myFile" ]; then
  touch "$myFile"
fi
4. 变量是否有值
#其他参数还有-n,-n是判断一个变量是否是否有值
if [ ! -n "$myVar" ]; then
  echo "$myVar is empty"
  exit 0
fi
5. 两个变量判断是否相等
if [ "$var1" = "$var2" ]; then
  echo '$var1 eq $var2'
else
  echo '$var1 not eq $var2'
fi
6. 比较数字的大小
if [ $df -gt 50 ]
  then
  $df > diskalert
  else
  exit
fi
7. 字符串和数字比较大小
if (d == 0)
if [ "$D" -eq "0" ] ; then
if (d != 0)
if [ "$D" -ne "0" ] ; then
if (d > 0)
if [ "$D" -gt "0" ] ; then
if (d < 0)
if [ "$D" -lt "0" ] ; then
if (d <= 0)
if [ "$D" -le "0" ] ; then
if (d >= 0)
if [ "$D" -ge "0" ] ; then
字符串比较
if (strcmp(str,”abc”)==0) {
}
if [ "$STR" != "abc" ]; then
8. If其他用法
shell脚本中判断环境变量是否存在2007-09-12 20:25
if [ ! -d "$JAVA_HOME" ]
then echo "JAVA_HOME not set!"
else echo "JAVA_HOME:" $JAVA_HOME
fi
更紧凑的写法
[[ -n $JAVA_HOME ]]&&echo exist||echo No exist
注意-d和-n是不同的,前者判断目录是否存在,后者判断String是否不为空
-a file
True if file exists.
-b file
True if file exists and is a block special file.
-c file
True if file exists and is a character special
file.
-d file
True if file exists and is a directory.
-e file
True if file exists.
-f file
True if file exists and is a regular file.
-g file
True if file exists and is set-group-id.
-h file
True if file exists and is a symbolic link.
-k file
True if file exists and its ``sticky'' bit is set.
-p file
True if file exists and is a named pipe (FIFO).
-r file
True if file exists and is readable.
-s file
True if file exists and has a size greater than
zero.
-t fd True if file descriptor fd is open and refers to a
terminal.
-u file
True if file exists and its set-user-id bit is set.
-w file
True if file exists and is writable.
-x file
True if file exists and is executable.
-O file
True if file exists and is owned by the effective exists的用法
user id.
-G file
True if file exists and is owned by the effective
group id.
-L file
True if file exists and is a symbolic link.
-S file
True if file exists and is a socket.
-N file
True if file exists and has been modified since it
was last read.
file1 -nt file2
True if file1 is newer (according to modification
date) than file2.
file1 -ot file2
True if file1 is older than file2.
file1 -ef file2
True if file1 and file2 have the same device and
inode numbers.
-o optname
True if shell option optname is enabled. See the
list of options under the description of the -o
option to the set builtin below.
-z string
True if the length of string is zero.
-n string
string True if the length of string is non-zero.
string1 == string2
True if the strings are equal. = may be used in
place of ==.
string1 != string2
True if the strings are not equal.
string1 < string2
True if string1 sorts before string2 lexicographi?
cally in the current locale.
string1 > string2
True if string1 sorts after string2 lexicographi?
cally in the current locale.
arg1 OP arg2
OP is one of -eq, -ne, -lt, -le, -gt, or -ge.
These arithmetic binary operators return true if
arg1 is equal to, not equal to, less than, less
than or equal to, greater than, or greater than or
equal to arg2, respectively. Arg1 and arg2 may be
positive or negative integers.
第二部分 shell脚本
1. 删除相同内容的文件
for file in *        #遍历文件
do
    if ! [ -f "$file" ] #如果文件存在的话,因为有的文件可能被剔除了.
    then
            echo $file" not exist"
    else
            for i in *
            do   
                if  [ "$file" != "$i" ]    #如果文件名不同
                then
                    if  cmp -s $file $i
                    then
                        mv $i ../same/
                    fi
                fi
            done
            mv $file ../unique/
    fi
done

我一共处理4000多个文件,运行的挺慢的,用了1天零2夜才处理完,我汗,竟剔出了近2000,我再汗.

为了提高效率,后来考虑只对文件大小相同的文件才进行比较.脚本如下:

for file in *        #遍历文件
do
    if ! [ -f "$file" ] #如果文件存在的话,因为有的文件可能被剔除了.
    then
            echo $file" not exist"
    else
            leno=`ls -l $file | awk '{print }'`    #使用ls和awk提出文件大小
            for i in *
            do
                leni=`ls -l $i | awk '{print }'`
                if  [ "$file" != "$i" -a "$leno" = "$leni" ]    #如果文件名不同,并且文件大小相同
                then
                    if  cmp -s $file $i
                    then
                        mv $i ../same/
                    fi
                fi
            done
            mv $file ../unique/
    fi
done

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。