标题：unix shell
Unix shell
shell术语最普通的解释就是：用户用来输入命令的任何程序。自从在Unix操作系统中用户能够选择所使用的shell（登录时应当执行哪种程序）以来，许多shell已经被开发出来。之所以被称为“shell”，是因为它隐藏了shell界面下面的操作系统的细节（这与最底层的“kernel”相反）。类似地，Unix图形化用户界面，注入GNOME、KDE和Xfce等，偶尔被称作“可视shell”或“图形shell”。shell术语通常与命令行相关联。在Unix中，任何程序都可能是用户的shell。希望使用不同语法输入命令的用户，可以指定一个不同的程序作为他们的shell。
术语shell也与一个特殊的程序相关，比如Bourne shell，sh。Bourne shell是早期版本Unix所使用的shell，并成为一个事实上的标准；任何类Unix系统至少拥有一个与Bourne shell相兼容的shell。Bourne shell程序位于Unix系统的“/bin/sh”。在某些系统中，比如BSD，“/bin/sh”是一个或等同于Bourne shell，但在Linux等其他系统上，“/bin/sh”更多的是一个兼容的、更加富功能性的shell链接。POSIX将其标准shell制定为Korn shell的一个严格子集。
SHELL的主要功能
一.命令执行
二.输入/输出重定向
三.环境控制
四.后台处理
五.SHELL脚本
Unix 命令
1．关於档案/目录处理的命令ls——列目录
这是最基本的档案指令。 ls 的意义为 "list"，也就是将某一个目录或是
某一个档案的内容显示出来。
格式：ls -1ACFLRabcdfgilmnopqrstux -W[sv] [files]
例：
#ls (不跟任何参数以简单格式列出当前目录中所有档案)
#ls bin (简单格式列出名为bin的文件或目录下的所有档案) 
#ls /u/ilasII_GB/lib （全路径，列出lib目录下的所有档案）
ls 的常用参数如下:
-a :在 UNIX 中若一个目录或档案名字的第一个字元为"." , 则使用 ls
将不会显示出这个档案的名字，我们称此类档案为隐藏档。如.profile、.tcshrc等
如果我们要察看这类档案，则必须在其后加上参数-a 。
-l :这个参数代表使用 ls 的长( long )格式，可以显示更多的资讯，如档案存取权，档案拥有者( owner )，档案归属组，档案大小，档案最後更新时间，甚而symbolic link 的档案是 link 那一个档等等。显示结果如下所示：
drwxrwxrwx 30 root bin 1024 May 23 10:38 u
drwxrwxrwx 2 root sys 512 Jul 28 1999 uacn
drwxrwxrwx 5 root sys 512 Jul 27 1999 udk
lrwxrwxrwx 1 root sys 11 Jul 27 1999 unix -> /stand/unix
drwxrwxrwx 35 root auth 1024 Apr 3 13:45 usr 
在开始的10个字符上系统给出文件的用户权限。该序列分成四个域。第一个字符为类型域，第2、3、4个字符为用户主域，第5、6、7个字符为同组用户域，第8、9、10个字符为其它用户域，域中字符的含义如下：
在类型域中： d 表示此文件是一个目录
表示此文件是一个普通文件 b 表示此文件是一个特殊的块设备I/O文件
c 表示此文件是一个特殊的字符设备I/O文件
l 表示此文件是一个连接文件。在其文件名称后紧跟与它连接的文件路径及名称。如：
unix-> /stand/unix
在“用户主”、“同组用户”、“其它用户”域中： r 表示有读权限。含义是可以拷贝或显示该文件或目录中的内容。
w 表示有写权限。含义是可以改变或修改该文件。
x 表示有执行权限。含义是可以执行该文件或用cd命令进入该目录，在该目录中建 
立文件或子目录等。
表示无权限。 chmod——变更档案模式( change mode )
这个指令是用来更改档案的存取模式( access mode )。在UNIX 一个档案上有可读(r)可写(w)可执行(x)三种模式,分别针对该档案的所有者(onwer )、同组者( group member )( 你可以ls -lg来观看某一档案的所属的 group )，以及其他人(other )。一个档案如果改成可执行模式则系统就将其视为一个可执行档，而一个目录的可执行模式代表使用者有进入该目录之权利。chmod就是用来变更一些档案的模式。
格式：chmod [ -fR ] mode filename ...
主要参数的意义如下:
-f（Force）： chmod 不会理会失败的动作。
-R（Recurive）： 会将所有子树下的所有子目录及档案改为你所要改成的模式。
Mode：指改变模式。包括三个方面：
为哪些用户改变 u——用户本身
g——同组用户
o——其他用户
如何改变 +——增加权限
-——去掉权限
什么权限 r——读权限
w——写权限
x——执行权限
例：
#chmodg0+w file1
修改前file1的权限为：-rwxr--r--
修改后file1的权限为：-rwxrw-rw-
也可以用一个三位八进位数字来表示对某些对象的存取权。
例：
#chmod666 * (所有用户都可读、写)
#chmod777 * （所有用户都可读、写、执行）
cat——串联显示命令
例：#catfile1 (将文件file1的内容在屏幕上不停地显示出来)
Cat命令还可以用来建立文件，如：
#cat>newfile
this is a text
Ctrl+D
即建立newfile文件，内容为：this is a text
#cat file1 file2 >file3 （将file1,file2两个文件接起来生成文件file3）
#cat f1 f2>>f3 （将f1,f2两文件接在f3文件的尾）
more——分屏显示文件内容
more 可以将所观察的档案根据分屏显示出来，并根据使用者的要求换页或卷行。
如果使用者要在某一个档案中搜寻一个特定的字串，则按 / 然後跟著打所要搜寻的单字即可进行搜寻。
如果你在使用中觉得已经看到了所要看的部份，可以按'q'离开 more 的使用。
在使用中按'v' 亦可以使用编辑器来编辑所观看的档案。
格式: more filename
cd——改变当前目录
格式：cddirname
例：
#cd (到用户的“家”目录)
#cd /usr (将目前目录转移到/usr目录，也即进入/usr)
#cd .. (返回上一级目录)
#cd ../.. (返回上一级目录的上一级目录) 
cp——拷贝
这个指令的意义是复制("COPY"), 也就是将一个或多个档案复制成另
一个档案或者是将其复制到另一个目录去。
格式：cp [-fip]source_file target_file （拷贝文件）
cp [-r|-R][-fip] source_file...target_file （拷贝目录）
常用参数如下:
-i :此参数是当已有档名为 f2 的档案时，若迳自使用 cp 将会将原来 f2的内容掩盖过去，因此在要盖过之前必须先询问使用者一下。如使用者的回答是y(yes)才执行复制的动作。
-r :此参数是用来做递回复制用，可将一整颗子树都复制到另一个目录中。 
cp 的用法例举如下:
#cpf1 f2 （将名为f1 的档案复制一份名为 f2 的档案）
#cpf1 f2 f3 ... dir （将档案f1 f2 f3 ... 复制一份放到目录 dir 里面）
#cp-r dir1 dir2 （ 将dir1 的全部内容全部复制到 dir2 里面）
mv——移动或改名
mv 的意义为 move , 主要是将一档案改名或移至另一个目录。
格式: mv [-fi] source_file... target_file 
主要参数：
-i ： -i 的含义与 cp 的相同，均是interactive询问之意。
-f： 强迫( force )执行 。所有其他的参数遇到 -f 均失效。
例：
#mvf1 f2 （将名为 f1 的档案变更成名为 f2 的档案）
#mvdir1 dir2 （ 将名为 dir1 的目录变更成名为 dir2 的目录）
#mvf1 f2 f3 ... dir （将档案f1 f2 f3 ... 都移至目录 dir 里面）
rm——删除
rm 的意义是 remove ，也就是用来删除一个档案。在 UNIX 中一个被删除的档案除非是系统恰好有做备份，否则是无法像DOS 里面一样还能够恢复。所以在做 rm 动作的时候使用者应该要特别小心。
格式: rm [-fiRr] file...
主要参数：
-f :将会使得系统在删除时，不提出任何警告讯息。
-i :在除去档案之前均会询问是否真要除去。
-r :递归式的删除。
注意：
不要随便使用rm-rf , 否则有一天你会"欲哭无泪"......
例：
rm f1 (删除名为f1的档案)
rm -r dir1 (删除名为dir1的目录及其下的所有档案)
rm-i sendmarc1 （删除名为sendmarc1的文件前先提示，待回答（Y/N）？）如下：
removesendmarc1 ? y
mkdir——创建目录
mkdir 是一个让使用者建立一个目录的指令。你可以在一个目录底下使用
midir建立一个子目录。
格式：mkdir dirname1 [ dirname2 ... ]
例：
#cd/u/ilasII_GB (将当前路径置换为/u/ilasII_GB)
#mkdir ilasbak (在/u/ilasII_GB目录下创建一个名为ilasbak的子目录)
rmdir——删除目录
rmdir 是用来将一个"空的"目录删除。如果一个目录下面没有任何档案，你就可以用rmdir 指令将其除去。 
格式：
rmdirdirname1 [ dirname2 .... ] 
如果一个目录底下有其他的档案，rmdir 将无法将这个目录删除，除非使用 rm 指令的 -r选项。
例 ：
rmdir ilasbak (删除名为ilasbak的空目录)
pwd——显示当前路径
例如:
#pwd
2．关于进程处理的命令：ps——显示目前你的 process或系统 processes 的状况
格式：
ps [-aAdefl] [-G groups] [-o format] [-p pids] [-ttermlist] [-u users] [-U users] [-g pgrplist] 
常用参数:
-a 列出所有用户的 process 状况。
-u 显示 user - oriented 的 process 状况 。
-x 显示包括没有 terminal 控制的 process 状况 。
-w 使用较宽的显示模式来显示 process 状况 。
例：
#ps-ae (显示所有进程的进程号及状态)
#ps-u ilasnt1 (显示用户ilasnt1的进程状态) 
PID TTY TIME CMD
1194 ttyp0 00:00:00 sh
#ps-t tty1a (显示设备tty1a上的进程)
如上所示：我们可以经由ps 取得目前 processes 的状况，如 PID（进程号） , TTY（设备名）、TIME（时间）、CMD（程序名） 等。
kill——杀进程
kill 指令的用途是送一个信号给某一个进程。因为大部份送的都是用来杀掉进程，因此称为 kill 。
格式：
kill[ -SIGNAL ] pid ...
kill-l
SIGNAL：为一个讯号的数字，从 0 到 31 ，其中 9 是 SIGKILL ，也就是一般用来杀掉一些无法正常终止进程的讯号。
你也可以用kill -l 来察看可代替signal 号码的数目字。
实例：
#!/bin/ksh
_compare_2_date()
{
if [ $# -ne 2 ];then
can_archive=false
return 1
fi
can_archive=false
year1=`expr substr $1 1 4`
month1=`expr substr $1 6 2`
day1=`expr substr $1 9 2`
month1=`expr $month1 + 0`
total_month1=`expr $year1 \* 12 + $month1`
year2=`expr substr $2 1 4`
month2=`expr substr $2 6 2`
day2=`expr substr $2 9 2`
month2=`expr $month2 + 0`
total_month2=`expr $year2 \* 12 + $month2`
# echo "$total_month1,$total_month2,$day1,$day2"
if [ $total_month1 -lt $total_month2 ];then
can_archive=true
elif [ $total_month1 -eq $total_month2 ];then
if [ $day1 -lt $day2 ];then
can_archive=true
fi
fi
}
if [ $# -ne 1 ]; then
echo usage: 'log_file_purge.ksh [OFFSET_MONTH]'
exit 1
fi
echo "Purge log job start at :" `date "+%Y-%m-%d %H:%M:%S"`
export OFFSET_MONTH=${1}
export TOTAL_FILE=0
export ARCHIVAL_DIR=/appsdata/archive/logs
export LOG_SUFFIX=ipe.log-
if [ ! -d "${ARCHIVAL_DIR}" ]; then
echo "Archival Log directory: ${ARCHIVAL_DIR} does not exists"
echo "Purge log job failed at :" `date "+%Y-%m-%d %H:%M:%S"`
exit 1
fi
CURRENT_DATE=`date "+%Y-%m-%d"`
echo "Current date is $CURRENT_DATE"
CURRENT_YEAR=`expr substr $CURRENT_DATE 1 4`
CURRENT_MONTH=`expr substr $CURRENT_DATE 6 2`
CURRENT_DAY=`expr substr $CURRENT_DATE 9 2`
ARCHIVAL_YEAR=$CURRENT_YEAR
ARCHIVAL_MONTH=$CURRENT_MONTH
ARCHIVAL_DAY=`expr $CURRENT_DAY + 0`
while [ $OFFSET_MONTH -gt 0 ]
do
ARCHIVAL_MONTH=`expr $ARCHIVAL_MONTH - 1`
if [ $ARCHIVAL_MONTH -lt 1 ]; then
ARCHIVAL_YEAR=`expr $ARCHIVAL_YEAR - 1`
ARCHIVAL_MONTH=`expr $ARCHIVAL_MONTH + 12`
fi
OFFSET_MONTH=`expr $OFFSET_MONTH - 1`
done
PURGE_DATE=`printf "%04s-%02s-%02s" $ARCHIVAL_YEAR $ARCHIVAL_MONTH $ARCHIVAL_DAY`
echo "Purge cutoff date is $PURGE_DATE"
ls -l $ARCHIVAL_DIR/$LOG_SUFFIX*|grep '^-'|awk '{print $9}'|while read file
do
# echo $file
file_name=`basename "$file"`
FILE_DATE=`expr substr $file_name 9 10`
# echo "FILE_DATE date is $FILE_DATE"
_compare_2_date $FILE_DATE $PURGE_DATE
if [ "$can_archive" = "true" ];then
echo "archive file [$file_name]"
rm -f $ARCHIVAL_DIR/$file_name
if [ $? -eq 0 ]; then
TOTAL_FILE=`expr $TOTAL_FILE + 1`
else
echo "Purge log job failed at :" `date "+%Y-%m-%d %H:%M:%S"`
exit 1
fi
fi
done
echo "Total purge $TOTAL_FILE log files"
echo "Purge log job finished successfully at :" `date "+%Y-%m-%d %H:%M:%S"`
exit 0