博主的 UNIX/Linux 笔记完全分享

Posted by Admin L in UNIX/Linux on 03-09-2011.

作者:牧山道人
原文地址:https://www.seeksunslowly.com/my-unix-linux-notes
转载请注明出处,谢谢。
_____________________________________

说明
1、该笔记从 2004 年 4 月正式将 UNIX 作为生产环境使用开始记录,截止到 2011 年 7 月份离开这个领域。
2、自己本就知道的常识(IT 素养及学校教材上学过的知识)就不再列出,如果查不到想要的内容,可留言。
3、由于从初涉 UNIX 开始记录,不少内容非常浅薄(但也见证了博主 UNIX 知识的积累过程),可能您已知十之七八或更多,不建议从头到尾阅读,收藏到书签备查即可。
4、这份笔记与众不同之处在于:不是为学而学,而是在使用 UNIX 作为生产系统过程遇到问题解决后的及时记录。在这 7 年 又 3 月时间里,我一直从事电信行业 IT 应用设计开发运维工作,所以,有不少内容还是有参考价值的。
5、由于 2004 年 4 月之前主要在台企工作或为繁体客户做软件,故初期有不少繁体字笔记,敬请谅解。
6、由于原始笔记直接在 EditPlus 中记录,只有些许格式控制,给您造成的阅读不便,也请谅解。

废话少说了,以下是全文(完全和盘托出,无任何删改)。

UNIX Series Note

0000 Remark:這個筆記檔裏其實包含了一些與UNIX緊密結合的C內容,因爲要講UNIX,離開C是不行的.但這裏面涉及到的C內容只作爲
講述UNIX相關知識的手段和工具,並不作爲新知識去了解,須詳細了解時,請查閱C相關資料
0001 tar指令
tar cvf FileName.tar Directories: 将Directories下的档案压缩成FileName.tar
tar xvf FileName.tar 将FileName.tar解压到目前目录
tar tvf FileName.tar 测试压缩包(主要看它内部的档案结构)
0002 more,man,cat指令在浏览时的使用方法(是一样的):
space 往下一页
return 往下一行
b 往前一页
f 往后一页
/string 查找string
?string 查找string
n和/string连用 查找下一string
n和/string连用 查找上一string
h 帮助
0003 ls指令:列出目录内档案/目录名称(如DOS的dir/w),常用参数:
-l 除了列出档名外,并列出档案属性及拥有者,档案大小及建立时间等资讯
-a 列出所有档案,包括隐藏档案/目录(All)
-R 递回地列出所有档案(子目录内所有档案及目录亦列出)
-F 显示档案格式(可执行档档名後加 ‘*'(其实并不一定可执行,只是已赋予其执行权限),目录名後加上’/’,link档后加上’->’
可用此选项只列出目录, ls -F | grep /
-d 只列出目录
-t 按时日排序
-n 按名称排序
-r 按指定排序方式逆序排列结果
-k 大小以KB为单位显示
说明:列出文件时有个Total数,此数 * 512 即为目前目录所占用空间
0004 IP地址实际上是在/etc/inet/hosts文件中定义的,我们常说的/etc/hosts是它的联结档
0005 /etc/passwd(有的系统是password)档案的格式和/etc/group文件的格式
passwd档案:用户名1:密码2(显示为x):用户ID3:用户组ID4:说明5:用户主目录6:用户的shell7
说明:1.长度应在1到8个字符之间,第1个字符必须是字母.如果超过8个字符,只有前8个字符有效
2.经过加密处理的口令.当用户使用passwd命令设置密码的时候,系统会对用户输入的口令进行加密.密码应该是6到8个字符,
其中应该有一个数字或其他特殊字符.如果密码这个域为空,登录的时候就不需要密码,但这会使系统很容易被入侵.密码域
为*的用户帐号无效,因为你键入的任何字符都不能被加密成为星号,所以没有人可以使用这个帐号登录系统
3.系统中每一个用户都被分配一个用户ID.ID为0是为root保留的.UID号1-99是为系统其它预定义的帐号保留的
4.对应于/etc/group档中的一行信息
7.当用户登录系统时要执行的命令的绝对路径名,典型的情况下:这个命令是shell,通常使用的shell是/user/bin/sh,
/usr/bin/ksh,和/usr/bin/csh.如果这个字段为空,系统会默认为/usr/bin/sh.命令字段不必都是一个shell,
例如,你可以在/etc/passwd文件中创建一个条目date:rc70x.4.hgjdc:20:1::/:/usr/bin/date,在这里命令字段
为/usr/bin/date.如果使用date作为登录名,然后键入正确的密码,系统会运/bin/date命令.然后退出系统登录
另:passwd文件的许可权限只能被设置为只读(r-r-r–),同时属主必须为root
group档案:组名:组的密码:组号:组的成员
0006 export指令:设置/显示参数设定值(不加参数则显示)
PS1 指令提示符,如export PS1=’Nosa:$PWD3’设置提示符为’Nosa:’ + 目前路径的形式
LANG 终端输出语言,如export LANG=zh设置输出为中文,不设值则还原为默认语言(export LANG=)
EDITOR 设置默认编辑器,如export EDITOR=vi,设置默认编辑器为vi(一般用于编辑crontab, 设置后在命令行即可使用vi (强!))
Note:有的OS下直接写export EDITOR=vi,但有的要先写EDITOR=vi,再用export EDITOR设置
export命令是在ksh下执行的,如果目前shell解释器不是ksh则无法执行命令.应先将shell设为ksh,再使用export,如
ksh
export EDITOR=vi
crontab -e
(工作中遇到此问题不得法,后请教zhaobh得以解决(原始目的只是想编辑crontab而已))
0007 rm指令:删除档案/目录,常用参数,:
-i 会徵求确认後删除
-r 删除指定目录及其下的所有档案
-rf 同上,但不会先徵求确认
Note:UNIX没有undelete,杀档前请确定你的大脑很清醒
rm -r a 与 rm -r a/*的区别:前者连a本身也删除,后者a中的档案/资料夹都被删光,但a本身存在
\rm 删除档案时不针求确认
如果在shell中用\rm,必须先cd到指定目录,再\rm档案,将带路径的档名作为\rm参数,系统不认
0008 ps指令:查询正在运行的进程, 不带参数列出当前终端正在运行的进程
-A 列出系统中正在运行的进程的详细信息
-e 列出除核心进程外的所有进程
-a 列出与终端有关的所有进程
-f 产生一个完全列表
-l 产生一个长列表 (显示不全时常用).
-t list列出由list表指定的终端创建的所有进程的详细信息
-x shows the extended processes.
用 ps -exf | grep “process_name port” 或 ps -exf | grep process_name 可查找指定进程(可指定端口)的运行情况
注意:一般一string内含有空格时,要用””定界
ps gu|grep oracle|awk ‘{b+=$5}END{print b}’: 查看某个用户占用记忆体总数 (Unit: KB)
ps auxw 查看各进程资源占用情况 (AIX)
0009 login指令:切换用户 su – username:也是切换用户(当以root用户登录时,su – username可不提供密码切换到其他用户)
0010 df指令:显示可使用之档案储存空间及档案数目
-k/m/g 查看现在系统的挂接和使用情况 (单位为K/M/GB)
df -k fs, 查看指定fs使用情况
0011 grep:於档案中寻找特定字串,找到后给出整行,不要使用 符,否则结果会变质(egrep功同大致相同)
格式:grep string files
-v 不计string(因为执行结果会显示出grep命令这行),如ps -ef|grep master_agent|grep -v grep
-n 显示string所在行号(特别有用!!!)
-i 不区分大小写 (特别有用!!!)
-h 当对多个档案作grep时, 在结果出不出现”档名:”字串 (特别有用!!!)
-e 并列显示多个 grep 条件, 如 grep -e abc -e edf -e fdsaf a.txt (目前只有 HP-UX 上试过).
以下是string的一些通配表达式:
^M 以M开头的行,^表示开始的意思
M$ 以M结尾的行,$表示结束的意思
^[0-9] 以数字开始的行,[]内可列举字母
^[124ab] 以1,2,4,a,或b开头的行
^b.503 句点表示任一字母
* 星号表示0个以上的字母(可以没有)
+ 加号表示1个以上的字母
\ 斜线可以去掉特殊意义(如[])
files 此参数可为*/*/*…,以便一次性查完整个目录
0012 管道:管道的符号是 “|”,用来连接两个命令。”|” 左边指令的输出作为 “|”右边指令的输入
例:ls -l .. | more 可将上一层目录内容以一页一页方式输出
who | grep b.503 | sort | more 可将目前上线的电机系学生名单经过排序後分页输出
0013 crontab:要求系统定期执行特定命令
-e 编辑crontab里的进程(在执行前须先将默认编辑器设为vi:export EDITOR=vi)
-l 列出crontab里的进程
参数后可跟用户名
crontab的格式为:执行时间 被执行程式 > 输出设备/档案
执行时间的设置格式为(举例说明):
0,5,10,15,20,25,30,35,40,45,50,55 8-18 * * *
从左起各栏位分别表示: 分,时,日,月, 周(各栏位以空格间隔,各栏位本身并列之取值以逗号间隔),8-18(对应于小时)表示时间
范围,注意只能用整数,这里是小时,要表示出几时几分,可在分钟栏位进行辅助设定,比如
原需求为每日在08:00-19:00之间每半小时执行一次,实现:30,59 8-18 * * * 被执行程式.当然这里有1分钟的偏差
另外这种情况:0 0-7 * * *,不要看成是不执行,应注意0的使用,它表示每日0-7时,0分执行
被执行程式:要自动执行的程式
> 输出设备/档案:程式执行结果输出到什么地方(一般为空设备(/dev/null)或某文字档案)
实战经验: 所有用户crontab均无法调用可能原因/usr/sbin/cron进程僵死, 以root重启之即OK.
0014 hostname:检视主机名称
0015 ifconfig指令
ifconfig命令用于查看和更改网络接口的地址和参数,如果要显示某台UNIX主机的IP地址,我们可以在命令行下输入ifconfig -a
系统会显示网络接口的名称,接口的状态(up or down),接口的IP地址和掩码等信息。如果我们要更改网络接口的IP地址,可以在
root权限下输入:
ifconfig hme0 down
ifconfig hme0 202.1.2.3 netmask 255.255.255.0 up
首先,使用down命令参数把网络接口hme0的服务暂时停止,然后再用ifconfig命令给接口分配新的IP地址和掩码,并启动网络接
口服务。本例中把hme0接口的IP地址设为202.1.2.3,掩码为255.255.255.0。我们也可以通过改变文件/etc/hosts中的IP地址
的值并重新启动系统来更改机器的IP地址。
在系统启动时,网络接口服务时自动被启动的,我们不需要手动地创建网口服务,但有时我们更改了网卡或增加了网卡后,系统不能
自动启动该接口服务,这时我们需要手动创建网口服务,在root权限下输入ifconfig hme0 plumb即可以为接口le0创建网口服务.
相应地,用ifconfig带unplumb参数可以停止服务并关闭网络接口,这时我们再用ifconfig -a 命令将看不到该网络接口。
0016 cp :就是copy啦!
-r Copy目录
0017 wc:计算档案的行数,字数及字元数
-l 统计行数
-c 统计字节数
-m 统计字符数
-w 统计字数
-C 同m
0018 用ftp上传档案时,若档案非纯文字档,应选择Binary格式(即键入 bin).
0019 空设备的表示方法:/dev/null
0020 mv
搬运工,若Source和Target在同一目录下,可更改名;若在不同路径则可在目录间搬移
0021 l:等价于ls -l
0022 在命令行提示符下,按,再按可调用历史命令(每次只显示一条,若想继续检视,继续按即可) (其实是 vi 操作).
0023 + ,滚到屏底,显示命令提示符
0024 + ,中断当前命令的执行
0025 man CommandName:检视指令的在线说明文档,也可檢視C語言函數的在線說明文檔
0026 cd [DirName]:DirName可为目录名称,路径或目录缩写
Note:
cd不带参数则进入使用者Login时的Home目录
.表示当前目录
..表示当前目录的上级目录
~和$HOME都表示Home目录
~-表示上一次到达的目录
0027 pwd:查看目前目录(也可用echo输出$PWD全局变数)
0028 rmdir:删除目录,等价于rm -r
0029 多个指令也可以全部写在同一命令列中,其间用分号(;)间隔
0030 mkdir:建立目录,可一次建立多个,其间用空号分隔,如mkdir dir0 dir1 dir2
-p 如果中间目录不存在,就创建这,如midir 1/1/1
0031 more filename:分页显示文件内容. 实战经验: 有时档案里含有控制字符, 用cat会将之解释出来显示, 但要配以awk取指定档位资料时, 往往得不到想要的结果,
此时便可用more来作, more会原样输出控制字符, 此时只要根据实际内容awk即可.
0032 cat filename:显示文件内容.用管道|与more连接即等价于more指令,用与grep连接即等价于grep指令
0033 clear:清屏
0034 which:在搜寻路径中($PATH)定位命令或执行档
0036 以斜線開頭的爲絕對路徑,否則爲相對路徑
0037 UNIX的特点
◆ 多用户,多进程,交互式
◆ 用C编写,易于移植
◆ 应用广泛
◆ 具有简单的用户接口
◆ 提供简单的外设接口
◆ 具有良好的安全性和稳定性
0038 UNIX的整体结构:核心层,Shell层,用户层
◆ 核心层:直接运行在硬體上,管理和驅動系統的硬體,並完成進程管理,存儲管理,檔案管理和網路管理的任務
◆ Shell层:由命令解釋器(Shell)和大量實用程式構成
◆ 用戶层:如cc,make等以及用戶自行開發的軟體
0039 UNIX檔案系統的特點
◆ 目錄層次的樹形結構
◆ 通過讀(r),寫(w),執行(x)權限控制實現對檔案的保護
◆ 把外設作爲特別的檔案管理,I/O系統從屬於檔案系統
0040 檔案系統內部結構:引导塊,專用塊,節點表,資料塊
◆ 引导塊:位於檔案系統的0磁道,含有機器啓動時引导系統和系統初始化的資訊,除/root檔案系統外其餘一般爲空
◆ 專用塊:緊接在引导塊之後,描述檔案系統狀態,如檔案系統有多大,可存放多少個檔案,檔案系統中空閑空間的大小
0041 用戶ID爲0的用戶爲根(root)或超級用戶(superuser),超級用戶對系統有自由的支配權
0042 prtconf:列出系统的硬体配置,可与grep连接来查找相关内容,如prtconf |grep Memory查看记忆体大小
0043 uname:显示计算机系统和操作系统的信息。
-m 显示机器的ID。
-M 显示机器型号.
-r 显示操作系统发行的版本号(release number).
-s 显示系统名。
-v 显示操作系统版本号。
-S name改变系统名。
-a 显示机器ID,操作系统的版本号及系统名
0044 crontab所产生的Log放在/var/mail/user下,其中user表示登录名,有些OS可能不是这个目录,man mail一把看看吧!
0045 cc,UNIX下的C源程式编译命令,格式 cc SourceFileName 或 cc -o ExeFileName SourceFileName
若采用前一程格式,则编译后默认生成a.out
0046 输入/出转向
每一个process均有三个特殊的file descriptor:标准输入(standard input),标准输出(standard output),
标准错误输出(standard error).这三个平常是接受terminal的输入,而由terminal显示出去.但是UNIX提供使用者可以使用
一般的档案或pipe来取代这些标准输出入设备,使用者可以利用”>”和”<"来进行输出入转向的工作. ◆ 输出转向 ◇ command > file
将一个指令的输出结果转向到一个档案,让此档案储存这个command的输出结果
Note:如果file已经存在,则file将会被覆盖
◇ command 2> file (注:2表示standard error的档案描述符,所以有此功效,下面的2>>道理相同,2和>间不能有空格)
与 > 相同,但是这个格式表示连standard error一起转向.在UNIX中,standard error在programer的习惯是用来显示
error 的发生,因此如果没有被转向时,standard output 的结果将会被转向到file,而standard error的结果仍将显示
在terminal上
◇ command >>file
此格示代表将standard output的结果append到file中.如果file已存在,则standard output的结果将会加到file的末
端,如果file原先并不存在,则file将会被开启而将standard output的结果存至file中
◇ command 2>> file
同上,不过此格式代表连standard error一起append到file之中

◆ 输入转向
◇ command < file 一般程式须要自终端机输入资料,而你可以将程式所要输入的资料统一编入档案中,利用转向一并输入 ◆ set ignoreeeof 由於转向输出会有将现有档案overwrite的危险,csh 与 tcsh 提供使用者一个方式来避免.当你执行set ignoreeeof之後, 如有输出转向到已存在之档案时,它会发出一个档案已存在的讯息.而在处理append转向上,如果已经set ignoreeeof,则当 要append一个不存在的档案,将会出现一个error messege.然而如果我们当真是要转向盖过一个已存在的档案,或者是要 append一个不存在的档案时,又要如何呢?我们只要在 ">” “>&” “>>” “>>&” 後面加上惊叹号”!”,成为 “>!”,…便可
0047 find:find pathname …,在指定目录及其子目录中搜寻
…参数部分常用者有
-name filename 指定档案名
-mtime n 指定修改时间在n天前的档案(+n,大于n天;-n,小于n天;n,刚好为n天)
-atime n 指定访问时间在n天前的档案(+n,大于n天;-n,小于n天;n,刚好为n天)
-user username 指定所有者
-type t 指定档案类型
-exec command{} 找到档案后要执行的命令(比如找到全部的core档案再删之find / -name core -exec rm{})
find . 列示当前目录及其下所有子目录及档案之指令, 可以快速查看以ls无法快速 (正常)列出之档案, 配以xargs参数即可实现强大之功能.
0048 DLL的使用
◆ 在makefile里增加编译DLL的命令,如下
$(DLLOBJPATH)/$(DLIBNAME): $(OBJS)
$(CC) -o $@ -G $(OBJS) $(CSDLIB)
◇ $ 取宏值
◇ DLLOBJPATH DLL路径
◇ DLIBNAME DLL档名
◇ OBJS DLL中物件名
◇ CC 编译器(一般用cc编译)
◇ -o cc参数,编译目标代码
◇ @ 代表第一行内容
◇ CSDLIB 编译DLL的选项(如-lm -lposix4 -lc -lgen -lsocket -lnsl -ldl -lCstd -lCrun)
◇ 第二行前面应有一个Tab符
◆ 正确设置系统变数LD_LIBRARY_PATH,如
LD_LIBRARY_PATH=/home/oracle/OraHome1/lib:/home/oracle/OraHome1/jdbc/lib.各路径间用冒号(:)分隔
0049 C頭檔案在/usr/include目錄下
0050 sleep:该命令可以使两条命令执行之间停顿一段时间.参数的单位是秒,如在命令执行之间等待5分钟:sleep 300(常用于shell)
0051 tail ? FileNam
-n 显示档案最後n行内容(可用于大档案(用vi,more,cat均无法快速显示,搜寻)
-f 跟踪档案的变更(相当有用)
+n 从第n行显示到档案最后一行(记下档案上次行数,再从该行开始扫描最近增加的行时非常好用)
0052 常用ftp指令/参数:
open Host(IP or HostName) 连接主机
cd 切换目录
lcd 切换发起方路径
get 下载一个档案
mget 下载多个档案
put 上传一个档案
mput 上传多个档案
bye 断开连接,回到发起方
user UserName Password 切换用户
-i 上传下载文件时不征求确认
-n 限制ftp的自动登录,即不使用.netrc文件,不出现登录提示行,-i和-n参数在所编写
的自动执行的ftp程序中应用广泛,因为此时用户不能干预
-T n 设置登录超时(单位:S)
-p 印出回显结果 (特别是在HP-UX上, ftp脚本不加此项便无回显)
bin 以二进制格式上传/下载文件
delete 删除文件
mdelete 批量删除文件
注意:在使用ftp非批量操作命仅时,对档案/资料夹的引用必须用全名(不能用*,?通配),-*参数只能在ftp时使用
0053 exit:退出目前连接
0054 r:重复执行上次的指令,可带一个命令(或其首字母),重复执行指定命令(如r vi,重复执行上次的vi指定)
0055 kill PID:杀进程,-9:强杀,-1:重启,-15:终止.只能杀自已的进程,除非你是root用户
0056 sar 1,查看CPU使用情况(只报告一次).其中%usr为用户占用比,%sys为系统占用比,%wio为IO占用比,%idle为空闲比;
sar 1 100(报告100次,可引伸). -u参数, 只针对CPU
sar -d n m, 查看磁盘使用情况 (目前只在 HP-UX 上试过).
0057 mpstat,查看CPU情况(一个CPU占一行)
0058 awk ‘{print $n}’,打印出源串的第n列资料,在'{}’内可使用””加入任意字符串,原样输出,典型例子为将月,日,年组合成有分
隔的时日,若要将n列输出到n个变数,则各$n间用,分隔,否则只能输出到一个变数
-Fc 用字符c分隔源串(不指定时默认以空格分),如awk -F”:” ‘{print $n}’
substr{$n,m,k} 从$n字段的第m位置开始取出k个字符,如awk ‘{print substr($1,4,3)}’, 其中4, 3也可为变数, 格式”‘${var}'”
格式及控制字符 print 中用””输出即可, 如 print “\n”
0059 gzip,压缩/解压命令,压缩后的文件后缀为.gz
-9 采用最高压缩比进行压缩
-d 解压一个压缩档 (可解压.gz及.Z档)
0060 gunzip,等价于gzip -d
0061 Command << Symbol ... Any Command ... Symbol 这种格式表示两个Symbol中间是基于某个命令的命令,比如isql,ftp,如此可实现在shell中嵌入其他工具的内部命令(如T-SQL) 注意: ◆ << Symbol的格式及位置. ◆ 在 Symbol后还可用管道符(|)或输出符(>,>>)执行任可shell指令,极方便灵活
◆ 外部Command前面不能有空格,即下例中isql前面一定不能有空格 (包括结整 Symbol前也不能有空格)
◆ 两Symbol间不能有shell注释符#
◆ 可在Symbol间任意引用shell变数(凡遇$一律执行宏替换)
例:
isql -SISMP -Uismpcfg -P123456 << ISQL | grep LoginName | awk -F: '{print $2}' | read LoginName DECLARE @vchLoginName VARCHAR(20) SELECT @vchLoginName = LOGIN_NAME FROM TB_SYS_LOGINMSG WHERE LOGIN_PHONE = '$PhoneNo' SELECT 'LoginName:' + @vchLoginName GO EXIT ISQL 0062 date:设置/读取系统日期 可用+带上format,%y--两码的年份,%m--两码的月份,%d--两码的日期,%H--24小时制的时数,%M--分数,%S--秒数, %e - 一码之日期. -s: 设置日期/时间. 如 date +%y%m%d 输出为040708 date +20%y/%m/%d" "%H:%M:%S 输出为2004/10/28 16:34:25 0063 stty: 显示, 设置终端环境 erase 设置删除键,如stty erase ^H(Backspace键) -a 显示所有终端设置. eol 行终止符, 如 stty eol [ kill 行删除符, 如 stty kill [ 注意, HP-UX 下不能默认不能输入 @ 符号(因为被作为 eol 及 kill 符了), 将 eol kill 在 .profile 里重新设置即可. 0064 对于用户的一些设置一般放在$HOME目录下的.profile文件里(每次登录时自动执行),为了永久保留这些设置,你也可以对它进 行适合你自己习惯的修改,以便提高工作效率(比如,我常用的是stty erase ^H--设置删除键为Backspace;export EDITOR=vi --以便每次编辑crontab内容前不须输入这个命令,export PS1='<$PWD>‘–设置为我喜欢的实用的提示目前路径的shell提示符)
0065 注意在写shell的时候,若习惯用ksh又喜欢加头注释,这时的shell写出来其实是用csh执行的,若执行时达不到预期结果,请在
shell前指定ksh,特别是放在crontab里执行时要注意
0067 cal:显示无格式文本日历
0068 compress: 将 tar 文件压缩成.Z格式
0069 uncompress: 将*.Z格式的压缩档解压
0070 启动shell外壳:csh启动C Shell外壳(环境);ksh启动ksh外壳
0071 du:报告指定目录及其子目录的空间使用情况,默认为当前目录(单位为0.5KB),可使用-k/m/g选项使单位为K/M/GB, -s看汇总(极有用)
0072 echo:显示指定的文本内容(或变数)
0073 file:报告指定文件中的类型(有用: 管线连接file * | grep directory | wc -l,统计目前目录下资料夹个数)
0074 finger:报告目前连接的用户信息
0075 当执行一个命令系统提示找不到,并且which也找不到时,可以用man看一下命令所在位置,带上路径执行即可
0076 passwd:更改密码
0077 用nohup执行命令,退出终端时不挂断命令的执行,默认将输出重定向到执行命令时所在目录的nohup.out档中
0078 &加在命令末尾,使命令在后台执行
0079 strings:find printable strings in an object or binary file
0080 在处理中文时,比如”cat $CfgFile|while read City Unit_ID”,$CfgFile内容第一列为中文.这时读取出来的第一个City
往往是乱码,影响正常处理,此时只要在$CfgFile第1行的City前加一个空格即可(此乃实作经验)
0081 若shell手动执行正常,而放在crontab里调用有问题,一般是环境变量有问题,可在shell的开头调用$HOME目录下的. .profile
以设置正确的环境变量(若.profile本身就有问题,可从其他地方copy过来,如/sybase/.profile)
0082 prstat -s size–查看记忆体占用情况,prstat -s cpu–查看CPU占用情况, -t 按用户汇总.
0083 /usr/platform/sun4u/sbin/prtdiag -v, 查看系统型号, 硬体配置情况等(出报表,很好用)
0084 w:看看别人在干啥
0085 shell的分類:一般來說,shell 可以分成兩類。第一類是由 Bourne shell 衍生出來的包括 sh,ksh,bash,與zsh。第二類
是由 C shell 衍生出來的,包括 csh 與 tcsh。除此之外還有一個 rc,有人認為該自成一類,有人認為該歸類在Bourne
shell。把上面的分類法記住,就可以寫出所有 Bourne shell類的shell或是所有C shell類的shell都可用的 script
0086 要如何設定 shell 的變數呢?在 C shell 類的 shell 中用 “set variable=value” 來設定只給這個 shell 看的變數,
用 “setenv variable value” 來設定環境變數。要去除變數則以 unset 與 unsetenv 為之。在 Bourne shell 類的
shell 中則用 “variable=value” 來設定變數,若要將一變數並成環境變數則用 “export VARIABLE_NAME”。要去除一個
變數則用 unset。
0087 write user [terminal]:向指定用户,指定终端发送讯息
0088 mesg:显示/设置是否接收其他用户通过write发来的讯息.mesg:报告;mesg n:拒收(系统管理员发来的仍会显示);mesg y:接收
0089 news:阅读新闻(一般是系统管理员向所有用户发出的,比如关机前发布)
0090 lp:列印文件
0091 cancel:取消列印
0092 不能作档名/资料夹名的特殊字符有:*,<,>,\,$,|
0093 如果档案/目录以命名以.开头,则表示此档/目录是隐藏的
0094 文件类型
d 目录
l 链接文件
n 网络专用文件
c 字符设备文件(终端,打印机等),传送数据给设备的时候,一次传送一个字符
b 块设备文件(磁盘),应用程序和工具是使用字符设备文件还是使用块设备文件来存取磁盘各有不同.阅读应用或者工具的说明文
档来决定使用那一种设备文件
p 命名的管道(一种内部过程通信通道)
0095 chown:改变档案或目录的属主(只有拥有人方可改变)
0096 umask:改变默认的文件或目录的存取权限
0097 chgrp:改变一个文件或目录的组
0098 chmod:改变一个文件或目录的存取权限,r = 4,w = 2,x = 1.常用chmod 755 filename,chmod = filename(取消所有权限)
0099 touch:更新文件的时间标志
0100 newgrp:更改组ID
0101 alias:给命令取别名
不带参数: 列出所有别名定义
alias 别名: 列出指定别名的定义
alias 别名=命令: 新建别名 (一般写在 .profile 里), 如 alias cdh=”cd /rasbkg”.
0102 unalias:取消一个别名
0103 history:显示命令历史
0104 env:显示用户环境设置
0105 whereis:定位源程序,二进制代码,和帮助手册的位置
0106 引用符号
反斜杠 \ 消除紧跟在它后面的特殊字符的特殊意义
单引号 ” 消除其内所有特殊字符的特殊含义
双引号 “” 包容性要差一点,可以去除除$和\之外的特殊字符的特殊含义(所以可用利用$来执行变量的宏替换)
0107 sort:排序. -u: 剃重. ls -l | sort, 按档案大小排序. -o 指定输出档, 源档案可为多个. -n 按数值排序, -r 倒序.
0108 cut:抽取内容 (-fn, 抽取第几栏位; -dc, 以c作分隔符)
0109 tr:转换字符 (如echo “Abc” | tr “A” “a”输出为”abc”)
0110 rlogin:远程登录,相当于telnet
0111 rcp:选程Copy,相当于cp的扩展
0112 remsh/rsh:在远程主机上执行命令
0113 rwho:报告远程主机上登录的用户情况
0114 ruptime:报告远程主机上状态
0115 quot:报告指定档案系统各用户所占用的空间情况
0116 fdisk:分区命令
0117 format:格式化
0118 mkfs:生成档案系统
0119 cpio:归档及恢复文件
0120 jobs:显示当前正在执行的后台进程
0121 fg:将指定进程放在前台执行
0122 bg:将指定进程放在后台执行
0123 nice:指定执行命令时的优先级,可取1-19的增量.前台进程默认nice值为20,后台进程的值为24.最大值为39.所以最大的增量为
19和15
0124 vipw:编辑/etc/passwd档,如果使用vi编辑,用户此时对密码的修改则不会写到此档中
0125 useradd:增用户
0126 userdel:删用户
0127 groupadd:增组
0128 groupdel:删组
0129 last:查看登录/出日志(即/var/adm/wtmp(x)档的内容)
0130 who:报告当前登录的用户
0131 whoami:报告自己目前登录的用户ID
0132 newfs:创建新档案系统
0133 mount:装载档案系统, -v,检视已装载之档案系统
0134 umount:卸载档案系统
0135 mountall:装载所有档案系统
0136 umountall:卸载所有档案系统
0137 fuser:显示哪些用户在使用哪些档案系统
0138 fsck:档案系统的检查与恢复,必须在一个静态的文件系统上运行,因此在执行命令之前要卸载文件系统,检查完后要加载此档案系统
0139 当输入命令一行显示不完时,由后面的行回到前面的行较困难,此时,按一下键,即可将命令缩减为一行,省事,快当!
0140 其实大部分的vi命令都能在命令行上使用,省事!
0141 命令提示符下,按,再按(其实就是vi的查找),便可输入要查找的历史命令,敲前n个字母回车就出来了,快当!
0042 xargs, 在命令的输出基础上用管道再执行一个命令, 如 find . -mtime -1 | xargs ls -lt > temp.log, 按大小
对一天前有修改的档案进行排序(整理空间时常用)
0143 swap -l, 查看交换区使用情况
0144 id: 查看当前登录的用户及组别
0145 shell处理小数的方法(使用awk工具): echo $Use | awk ‘{print $0 / a}’ a=$Total (注意a=$Total之=号两边不能含空白), 并且可用awk进行四舍五入,
如: echo $Use | awk ‘{printf(“%.2f\n”, $0 / a)}’ $Total (将上例中$Use,$Total换成实际业务所需数值即可)
0146 vmstat: 系统资源使用情况报告(如 Memory) (Sun, Linux).
0147 bc: 计算器
0148 当将变数值用于其他程式中作巨集替换用时, 如sqlplus中, select * from tDate$Month_0, 其中$Month代表月份, 若直接如此编写会将$Month_0作
为一个变数处理, 得不到想要的结果, 而用”$Month”指定时又会将””代入Table Name中, 所以应用${Month}来代替, 这样就没有问题了. ${Month}的
写法最初用shell时理解到了, 但觉得很多地方没必要写成这样, 所以一直没这样用, 后来发觉像这个例子中一样用到其他程式中时极其有用, 所以
一般情况下建议用变数时采用${VarName}的写法, 以免出错
0149 head, 查看档案头, 与tail相反
0150 errpt (AIX上查看系统错误)
0151 lsps -a (AIX上查看swap区分布及使用情况 – 即虚拟内存使用情况, -s, 只查看使用情况)
0152 slibclean (AIX上清除处理程序遗留的旧分页信息)
0152 smit (AIX上的System Management Interface Tool)
0152 swapon: 启动指定/所有的swap空间
0153 lsvg: 显示卷名称; lsvg -l rootvg: 显示rootvg卷的详细信息
0154 /etc/swapspaces档案 – 存放分页空间表格信息
0154 mount卷的方法: varyonvg datavg 加载datavg卷; mount /dev/data1 加载datavg下的一个data1卷
0155 Solaris系统日志/var/adm/messages
0156 AIX版号中的”L”表示AIX和LINUX共存或者支持LPAR (如AIX 5.2L), 可用prtconf | grep “LPAR”来查看是否支持
0157 主机及用户间信任关系的配置, 异动/etc/hosts (格式: IP hostname)及$HOME/.rhosts (格式: IP), 若为不同平台, 尚须异动
/etc/hosts.equiv (格式: IP UserName或HostName UserName)
0158 检查双机进程是否启动: lssrc -g cluster (only suits AIX)
0159 HP-UX对中文支持不太好, 在.profile中加入以下内容即可
export LANG=zh_CN.gb18030
stty -istrip
stty erase “^H” kill “^U” intr “^C” eof “^D”
stty hupcl ixon ixoff
0159 问题:
执行execd时出现错误0826-604

环境 产品:AIX
软件版本:AIX V4
问题 执行execd时出现错误0826-604: the login is not correct
解答 修改/etc/inetd.conf文件
#vi /etc/inetd.conf

将: exec stream tcp6 nowait root /usr/sbin/rexecd rexecd
改为: exec stream tcp6 nowait root /usr/sbin/rexecd rexecd -c

最后保存该文件。
再用下面刷新inetd进程:
# refresh -s inetd

0159 shell取n天前当前时日最简方法
TZ:时区系统变数
原理 – 改变时区, 不用连DB, 不用调外部可执行程式
a. 先 echo $TZ, 查看目前时区之设定值. 比如结果为BEIJING-8
b. 改变TZ变数值, 得到前n天的目前时日, 天数等于24 * n. 如要得到昨天的目前时日, 则export TZ=BEIJING+16即可
c. 设定完成后, 再使用date命令即可在shell中任取时日
d. 使用完成后记得将TZ还原, 最好先输出到一变数, 最后直接引用此变数还原即可
0160 line: 只取结果中的一行, 相当有用, 如ls -t | line即可取出最新文件
0161 isainfo -kv: 检视OS位数
0162 locale: 检视目前字符集; -a: 检视所有已安装字符集
0163 ps -eo pid,pcpu,pmem,comm|grep “procName”: 查看某进程资源占用情况 (Sun主机)
0164 basename: 返回字串所代表的档名 (不含路径, 如basename /work/test.cfg返回test.cfg, 此指令不检查档案是否存在).
0165 sed: 流编辑器, 格式: sed command file, 如sed ‘s/$/|/g’ test.txt, sed ‘s/.$//g’ …(去掉回车符)command参数基本可套用vi命令行, 不实际修改档案.
0166 nmon: 系统监控程式, 启动后按m可查看记忆体使用情况, 按c查看cpu使用情况
0167 bdf: HP-UX 下的FS查看器, 相当于 Sun 的 df -k.
0168 mkuser/rmuser 建立删除用户 (AIX, 建好后以 root 修改其口令即可实现初始化, 所建用户登录后默认情况要求立即修改口令).
0169 set -o vi: 设置按再按 / 后, 输入字符则调用历史指令.
0170 在 Windows 上压缩文件 (夹)并在 UNIX 上实现解压的方法: 在 Win 上以 WinRAR 制作 .zip, ftp 到 UNIX 后以 unzip 指令解之即可.
0171 SNMP 服务启/停方法: /etc/init.d/snmpd start/stop; SNMPTrap: /etc/init.d/snmptrapd start/stop (Linux).
0172 530 Must perform authentication before identifying USER 解决办法
进入/etc/xinet.d/gssftp 文件. 找到
server_args = -l -a
把-a 选项移除.
然后:service xinetd restart
再:service vsftpd restart
就解决了。
0173 split 拆分大文件. -l n: 指定行数; -b n: 指定字节数.
0174 netstat (-na, 查看端口及其连接状态, Sun, IBM; -in 查看 IP 地址, HP).
0175 HP-UX 下, 按结束回显, 类似于 AIX 下的 .
0176 shell 调试参数 -x, 如 ksh -x test.ksh, 会将脚本与其输出一并输出.
0177 当模拟手工 telnet 跳转操作时, 有可能对端主机会报”No terminfo entry for UNKNOWN”错误, 这种情况一般是在 crontab 中调用
脚本时发生, 因为 crontab 没有通过任何终端执行, 逆向思考一下: 既然不认识本脚本执行终端, 那就显示声明一下:
始发机: export TERM=vt100
中转机: echo “export TERM=vt100”
其中 vt100 为典型终端类型.
0178 带端口的 ssh 格式 ssh -p port user@host
9995 附录A:默认文件系统结构
/usr/  可共享的操作系统命令,库,和文档
/usr/bin  操作系统的用户命令
/usr/conf  内核配置文件
/usr/contrib  发布的软件
/usr/lbin  其它命令文件
/usr/local  用户自己安装的软件
/usr/newconfig 默认的操作系统配置数据文件
/usr/sbin  系统管理命令
/usr/share 独立结构的共享文件
/usr/share/man 操作系统帮助手册
/usr/share/doc 技术相关的白皮书

/sbin 引导系统和安装其它文件系统至少需要的命令
/opt  应用程序
/etc  系统配置文件,不再包含可执行文件
/dev 设备文件(一般包含所有的终端,moderm,lan和印表机的设备文件)
/dev/dsk  包含所有的块磁盘设备文件
/dev/rdsk 包含有所有的裸磁盘设备文件
/dev/rmt  包含有所有的磁带设备文件
/var  动态信息例如日志,临时文件,中间文件,打印缓冲文件.在通常情况下,任何应用程序或者命令在运行
时候创建的文件,对操作系统来说不是关键性的数据,通常都会被放在/var目录下.系统管理员如果想
要释放磁盘空间,可以通过搜寻/var目录,来查找哪些文件可以被清除掉
/var/adm  保存普通的管理文件,日志和数据库,例如:syslog产生的文件,crontab使用的文件,内核dump文件
/var/adm/crash  内核崩溃dump文件会被保存在这个目录下
/var/adm/cron  crontab使用的日志文件,
/var/adm/sw  软件发布使用的日志文件
/var/adm/syslog  系统日志,应用程序和内核都可以在这个文件中写日志.syslog守护进程负责写这些日志信息
/var/adm/sulog  su命令的使用日志
/var/adm/wtmp(x) 保存每次成功登录/出的资讯,用last命令查看
/var/adm/utmp  包含登录到系统的所有用户的记录.write,who等命令会使用这个文件
/var/adm/crash  内核的dump文件
/var/mail  收到的邮件
/var/opt/  应用运行时产生的文件(例如日志,临时文件)。每一个应用程序有自己的目录
/var/spool  操作系统子系统,例如lp(打印),cron等系统的缓冲文件
/var/tmp  /usr目录下的命令产生的临时文件
/mnt  本地装载的文件系统
/tmp  操作系统临时文件
/stand 内核和引导加载器
/home  用户目录
9996 附录B:共用记忆体的使用
◆ 简介:共用记忆体的使用允许两个或多个进程共享一给定的存储区.资料无需在客户机和伺服器间复制,所以它是最快的一种IPC.使
用共用记忆体的唯一窍门是多个进程之间对一给定存储区的同步存取.若伺服器将资料放入共用存储区,则在伺服器作完这一操作之
前,客户机不应当去取这些资料.一般用信号量来实现对共用记忆体的同步(信号量一个全局变数,记录现在共用忆体的读写状态).
内核为共用存储段设置了一个shmid_ds结构(可參考頭檔案)
◆ 影响共用记忆体的系统限制
Name Remark Representative Value
——————————————————————
SHMMAX 段的最大字节数 131072
SHMMIN 段的最小字节数 1
SHMMNI 段最大个数 100
SHMSEG 每进程可占用段最大个数 6
——————————————————————
◆ 使用
◇ shmget:获得一个共用记忆体的标识符
#include
#include
#include
int shmget(key_t key,int size,int flag);
Return:成功为共用记忆体ID,错误为-1
◇ shmctl:操作共用记忆体
#include
#include
#include
int shmctl(int shmid,int cmd,struct shmid_ds *buf);
Return:成功为0,出错为-1
Remark:cmd指定下列5种命令中一种,使其在shmid指定的段上执行
※ IPC_STAT 对此段取shmid_ds结构,并存放在由buf指向的结构中
※ IPC_SET 按buf指向的结构中的值设置与此段相关结构中的下列三个栏位:shm_perm.uid,shm_perm_gid,
shm_perm.mode.此命令只能由下列两种进程执行:一种是其有效用户ID等于shm_perm.cuid或
shm_perm.uid的进程;另一种是具有超级用户特权的进程
※ IPC_RMID 从系统中删除该共用记忆体.因为每个共用记忆体段有一个连接计数(shm_nattch@shmid_ds),所以除非使用
该段的最后一个进程终止或与该段脱接,否则不会实际上删除该存储段.不管此段是否仍在使用,该段标识符立
即被删除,所以不能再用shmat与该段连接.此命令只能由下列峡谷 种进程执行:一种是其有效用户ID等于
shm_perm.cuid或shm_perm.uid的进程;另一种是具有超级用户权限的进程
※ SHM_LOCK 锁住共用记忆体存储段.此命令只能由超级用户执行
※ SHM_UNLOCK 解锁共用存储段.此命令只能由超级用户执行
◇ shmat:将共用存储段连接到进程的地址空间
#include
#include
#include
void shmat(int shmid,void *addr,int flag);
Return:成功为指向共用存储段的指针,错误为-1
Remark:共用存储段连接到调用进程的哪个地址上与addr参数以及在flag中是否指定SHM_RND位有关
※ 如果addr为0,则此段连接到由内核选择的第一个可用地址上
※ 如果addr非0,并且没有指定SHM_RND,则此段连接到addr所指定的地址上
※ 如果addr非0,并且指定了SHM_RND,则此段连接到(addr-(addr mod SHMLBA))所表示的地址上.SHM_RNDW的意思是取整.
SHMLBA的意思是低边界地址倍数,它总是2的乘方.该算式是将地址向下取最近1个SHMLBA的倍数
※ 一般应指定addr为0,以便由内核选择地址
※ 如果在flag中指定了SHM_RDONLY位,则以只读方式连接此段.否则以读写方式连接此段
◇ shmdt:对共用存储段的操作结束时,脱接该段.
#include
#include
#include
int shmdt(void *addr);
Return:0-Successful;-1-Unsuccessful
Remark:并不从系统中删除其标识符以及其资料结构(shmid_ds),该标识符仍然存在,直至某个进程(一般是伺服器)调用shmctrl
(带命令IPC_RMID)特地删除它.addr参数是调用shmat时的返回值
◆ Remark
◇ 内核将以地址0连接的共用存储段放在什么位置上与系统密切相关(因不同系统而异)
◇ 共用存储段紧靠在栈之下,实际上,在共用存储段和栈之间有大约8M字节的未用地址空间
◇ 共用记忆体可由不相关的进程使用
9997 附录C:vi的使用
◆ 进入方法:
vi 进入vi而不读入任何文件
vi filename 进入vi并读入指定名称的文件(新,旧文件均可)
vi +n filename 进入vi并且由文件的第n行开始
vi + filename 进入vi并且由文件的最后一行开始
vi +/word filename 进入vi并且由文件的word这个字开始
vi filename(s) 进入vi并且将各指定文件列入名单内,第一个文件先读入
vedit 进入vi并且在输入方式时会在状态行显示”INSERT MODE”字样
◆ 编辑数个文件(利用vi filenames进入vi后)的命令行命令
:args  显示编辑名单中的各个文件名
:n 读入编辑名单中的下一个文件
:rew 读入编辑名单中的第一个文件
:e# 读入编辑名单内的前一个文件
:e file  读入另一个文件进vi(此文件可不在编辑名单内),若原文件经修改还没有存档,则应先以:w存档。
:e! file 强迫读入另一个文件进入vi,原文件不作存档动作
◆ 常用命令集
/string–搜寻string
^F–PageDown ^B–PageUp
^G–display the file information & current line no n–继续搜寻
Esc–在输入模式和命令模式间切换 G–移到档案尾
$–移到行尾 ^–移到本行第一个不为空白的字符处
o–在目前行后面插入一新行 ^U–Half PageUp
h,j,k,l–分别控制光标左,下,上,右移一格 0–移到行首
^D–Half PageDown e–移到本word的尾部
w–移到下个Word的开头 yw–复制光标所在处到字尾的字符(必须与p搭配使用)
b–移到上个Word的开头 #command–执行#次command(#表示数字)
x–删除光标后面的一个字符 X–删除光标前面的一个字符
dd–删除光标所在行 p–将缓冲区内的字符粘贴到光标所在位置
yy–复制光标所在行(必须与p搭配使用yw,yy,p使用时前面可以跟一个字母,表示到某缓冲区/到某缓冲区,vi提供缓冲区的功能)
r–取代光标所在处的字符 R–取代字符直到按Esc为止
cw–更改光标所在处的字到字尾$处($由vi自动产生) c#w–更改#个字符
dw–删除光标所在处的word d0–从行首删到光标处
#1,#2 w filename–摘取文章的某一段,存成另一个文件.#代表行号,例如30,50 w 2005-01-13,将您正在编辑文章的第30~50行存成
nice这个文件
!command–执行命令,并将结果插入到光标所在行的下一行 d$–从光标处删到行尾(同D)
[[–移到档案首 ]]–移到档案尾
:set nu–在每一行列出行号
:w–Save :w!–无条件存储
:w FileName–Save As… :wq–Save & Quit(同ZZ及:x)
:q–Quit :q!–Do not save and quit
:e FileName–Open File & Edit It :r FileName–从档案中读入,并插入当前档案尾部
:dG–刪除檔案中所有內容 :$–移到档案尾(同G)
:n–n为一数字,表示到第n行(同nG) :!command–暂时退出vi并执行command,完成后回到vi
:sh–暂时退出vi到shell提示符下,按^D(或exit)可返回vi :n,md–删除n至m行
:1,$s/string/replae/g–将全文的string字符串取代为replace字符串,其中1,$s就是指搜寻区间为文章从头至尾,g则是表
示全部取代不必确认
:%s/string/replace/c–同样会将全文的string字符串取代为replace字符串,和上面指令不同的地方是:%s和1,$s是相同
的功能,c则是表示要替代之前必须再次确认是否取代
:1,20s/string/replace/g–将1至20行间的string替代为relpace字符串
:%s/^/some string–在文件的第一行至最后一行的行首插入“some string”(%s可取代为1,4s等)
:%s/$/some string–在文件的第一行至最后一行的行尾插入“some string”(%s可取代为1,4s等)

9998 附录D:Shell
0.如何指定使用那一个Shell来解释所写的Script
◆ Script中第一个非空白字元不是”#”,使用Bourne Shell
◆ Script中第一个非空白字元是”#”时,但不以”#!”开头时,则它会使用C Shell
◆ Script中第一个非空白字元是”#!”,则”#!”後面所写的就是所使用的Shell,而且要将整个路径名称指出来
Note:这里建议使用第三种方式指定Shell,以确保所执行的就是所要的.Bourne Shell的路径名称为/bin/sh,
C Shell为/bin/csh,K Shell为/bin/ksh.除了在Script内指定所使用的Shell 外,你也可以在命令列中强制指定。比如你要用C Shell执行某
个Script,你可下这个命令:csh filename,此时的Script的存取权就不一定要为可执行档,其内部所指定的Shell也会无效
1.执行Shell时,若带参数,各传入参数间以空格分隔
2.常用的Shell有
◆ Bourne Shell /bin/sh
◆ C Shell /bin/csh
◆ KornShell /bin/ksh
2.执行Shell的方式
以下为Bourne Shell
◆ 直接下命令:FileName
这个方式和在命令列中直接下命令的效果一样
◆ 使用sh命令:sh FileName
这个档案必须是Bourne Shell的Script,但这个档案并不一定要设成可执行,除此之外和直接下命令的方式一样
◆ 使用”.”命令:. FileName
这时和使用sh命令相似,只不过它不像sh一般会产生新的process,相反地,它会在原有的process下完成工作
◆ 使用exec命令:exec FileName
此时这个Script将会被所执行的命令所取代,当这个命令执行完毕之後,这个Script也会随之结束
以下为C Shell
◆ 基本上和Bourne Shell相同,只有一点在Bourne Shell中的”.” 命令在C Shell 中则为”source”命令。
3.语法部分(Bourne Shell)
◆ \ 续行符
◆ # 注释符
◆ return 退出程式的执行
◆ = 赋值符(两边不能有空白,切记)
◆ $ 取用变数
◆ readmonly UserVar 将使用者变数设成唯读
◆ shift 将参数往前移一格(即去掉第一个参数,主要是为了使用第9个以上的参数)
◆ set [arg0, arg1, …] 改变$n及$*,不带参数,则会列出所有已经设定的变数以及其值(注意,后有一空格)
◆ read var1 var2 … 从键盘读入字串给变数(各字串间用空格隔开,与var var2 …一一对应).如果输入的字串比变
数还多,最後一个变数会将剩下的字串当成其值;如果输入的字串比变数还少,则後面的变数会设
成空字串
◆ ” 字串定界符(若字串间有空格,将之赋给一变数时须加上定界符)
◆ “ 命令替换符(使某个命令的输出成为另一个命令的参数时,就一定要使用这个方法.Shell会以
这个命令执行後的输出结果代替这个命令以及两个”`”符号,如
str=’Current directory is ‘`pwd`
echo $str
结果如下:
Current directory is /users/cc/mgtsai
◆ $(cmd) 功能同“
◆ && And运算符
◆. filename include一个shell到当前shell
◆ test expression 条件判断语句,条件为真时则传回非零值,而条件为伪时则传回零.在所有的流程控制都必须用到
test语句来判断真伪
Note:expression中可包含多个判断准则,两准则间用”-a”代表逻辑AND运算,”-o”代表逻辑
OR运算,而在准则前放置一”!” 代表NOT运算.如果没有括号,则优先权则为! > -a > -o,想使
用左右括号时,必须在其前面加上”\”.以下是有关准则的叙述(合叙述时传回真,否则传 回伪
string string不为空白字串
-n string string的长度大於0 (注意: 在Linux中刚好相反)
-z string string的长度等於0
string1 = string2 string1等於string2
(=号两边一定要加空格,如test $KPI_Value = “successful!”,切记切记)
string1 != string2 string1不等於string2
(注意事项同 = )
int1 -gt int2 int1大於int2
int1 -ge int2 int1大於等於int2
int1 -eq int2 int1等於int2
int1 -ne int2 int1不等於int2
int1 -le int2 int1小於等於int2
int1 -lt int2 int1小於int2
-r filename 档案可读取
-w filename 档案可写入
-x filename 档案可执行
-f filename 档案为一般档
-d filename 档案为目录
-s filename 档案为非空的一般档
-e filename 档案是否存在
◆ expr expression 运算语句.expression是由字串以及运算子所组成,每个字串或是运算子之间必须用空白隔开,
下表是运算子的种类及功能,而优先顺序则以先後次序排列,我们可以利用小括号来改变运算的
优先次序.其运算结果则输出至标准输出上
: 字串比较。比较的方式是以两字串的第一个字母开始,而以第二个字串的字母
结束。如果相同时,则输出第二个字串的字母个数,如果不同时则传回0
* 乘法
/ 除法
% 取馀数
+ 加法
– 减法
< 小於 <= 小於等於 = 等於 != 不等於 >= 大於等於
> 大於
& AND运算
| OR运算
当expression中含有*, (, )等符号时,必须在其前面加上\,以免被Shell 解释成其它意义
expr 2 \* \( 3 + 4 \) 其输出为14
◆ 参数数目在1-9之间
◆ 变数直接使用,无须声明
◆ 变数型态只有字串变数,所以要使用数值运算则必须靠外部命令达成目的.有下列几种
◇ 使用者变数
这是最常使用的变数,我们可以任何不包含空白字元的字串来当做变数名称
◇ 系统变数(环境变数),请参见9999
◇ 特殊变数
有些变数是一开始执行Script时就会设定,并且不可加以修改,但我们不叫它唯读的系统变数,而叫它特殊变数(有些书会叫它
唯读的系统变数),因为这些变数是一执行程式时就有了,况且使用者无法将一般的系统变数设定成唯读的.如下:
$0 这个程式的执行名字
$n 这个程式的第n个参数值,n=1..9
$* 这个程式的所有参数
$# 这个程式的参数个数
$$ 这个程式的PID
$! 执行上一个背景指令的PID
$? 执行上一个指令的返回值
示例:
档名:Test.sh 参数:this is a test
┌———————————┐
│echo Filename: $0 │
│echo Arguments: $* │
│echo No. of args.: $# │
│echo 2nd arg.: $2 │
│shift │
│echo No. of args.: $# │
│echo 2nd arg.: $2 │
│set hello, everyone │
│echo Arguments: $* │
│echo 2nd arg.: $2 │
└———————————┘
结果如下:
Filename: Test.sh
Arguments: this is a test
No. of args.: 4
2nd arg.: is
No. of args.: 3
2nd arg.: a
Arguments: hello, everyone
2nd arg.: everyone
◆ 流程控制
◇ if then
if (condition) then
then-commands
fi
Note:condition 是一个test语句,下述各种流程中的condition 都是test语句
◇ if then else
if (condition) then
then-commands #注:必须要有命令(切记)
else
else-commands #注:必须要有命令(切记)
fi
◇ if then elif
if (condition1) then
commands1
elif (condition2) then
commands2
elif (condition3) then
command3
…elif可有多个…
else
commands4
fi

◇ for in
for var in arg-list
do
commands
done
例:
for a in xx yy zz
do
echo $a
done
结果如下:
xx
yy
zz
◇ for:将传入参数中依次读入var
for var
do
commands
done
◇ while
while (condition)
do
commands
done
Note:可以将一个命令的输出用作while回圈(太方便了!),如
ls -l ycount*|awk ‘{print $9}’|while read FileName
do

done

◇ until
until (condition)
do
commands
done
◇ break及continue
这两者是用於for,while,until等回圈控制下,break 会跳至done後方执行,而continue会跳至done执行,继续执行回圈
(break及continue后可跟一参数, 1表示跳出本层回圈, 2表示上层, 3表示上上层)
◇ case
case str in
pat1) commands1;;
pat2) commands2;;
pat3) commands3;;
esac
而pat 除了可以指定一些确定的字串,也可以指定字串的集合,如下
* 任意字串
? 任意字元
[abc] a, b, 或c三字元其中之一
[a-n] 从a到n的任一字元
| 多重选择
◇ 函数
function-name()
{
commands
}
而要呼叫此函数,就像在命令列下直接下命令一般,函数定义在被呼叫处的前面或后面均可 (事实证明ksh中必须放在前面定义)
呼叫此function时, 若要带参数, 直接function-name paraA paraB即可, 不须在函数声明处定义.
以下为C Shell
◆ set var=value 变数赋值语句
◆ source filename include一个shell到当前shell
◆ 变数
◇ 字串变数
这个部分和Bourne Shell的变数一样
◇ 数字运算
基本上C Shell没有数字变数,但C Shell 却有简单的方法处理数字运算@ var operator expression
operator可以是C 语言中的=, +=, -=,…,而expression则是运算式.运算式的运算子如下:
() 改变计算的顺序~@
~ 位元NOT运算
! 逻辑否定
% 取馀数
/ 除
* 乘
– 减
+ 加
>> 右移
<< 左移 > 大於
< 小於 >= 大於等於
<= 小於等於 != 不等於 == 等於 & 位元AND运算 ^ 位元XOR运算 | 位元OR 运算 && 逻辑AND || 逻辑OR 除此之外,我们也可以检验一个档案的状态-n filename,而-n可为下列之一: -d 档案是一个目录 -e 档案存在 -f 档案为一般的档案 -o 使用者拥有这个档案 -r 使用者可以读取这个档案 -w 使用者可以写入这个档案 -x 使用者可以执行这个档案 -z 档案长度为0 ◇ 阵列 在C Shell 中,我们可以宣告阵列变数,方式为set var=(val1 val2 ...) 而var[1]之值为val1,var[2]之值为val2...,$var代表整个阵列.我们可以用$#var来计算阵列个数,也可以用$?var 来检查某个变数是否已宣告 ◇ 特殊变数 $argv 和Bourne Shell的$*相似,只不过这是一个阵列。 $argv[n] 和Bourne Shell的$n相同,但不受个数限制。 $#argv 和Bourne Shell的$#相同 $home 和Bourne Shell的$HOME相同 $path 和Bourne Shell的$PATH相似,只不过这是一个阵列 $prompt 和Bourne Shell的$PS1相同 $shell Shell的路径名称 $status 和Bourne Shell的$?相同 $$ 和Bourne Shell的$$相同 $< 键盘输入 ◆ 流程控制 ◇ 在C Shell中流程控制不像Bourne Shell中一般需要使用test命令,相反地,它和C 语言类似只要在条件中写出运算式即可 当运算结果不为零时,其值为真;为零时其值为伪 ◇ if if (expression) simple-command ◇ goto goto label Note:相应的label名要加冒号(:),和其他大部分语言一样 ◇ if ... then ... else if ... else ... endif if (expression) then commands endif if (expression) then commands else commands endif if (expression) then commands else if (expression) then commands ...可有n个else if... else commands endif ◇ foreach 这和Bourne Shell的for in相似。语法如下 foreach var (arg-list) commands end ◇ while 这和Bourne Shell的while相似。语法如下 while (expression) commands end ◇ break及continue 这和Bourne Shell的break 及continue相似,是用来中断foreach 及while 回圈 ◇ switch 这和Bourne Shell的case相似。语法如下 switch (string) case pat1: commands1 breaksw case pat2: commands2 breaksw case pat3: commands3 breaksw endsw 9999 附录E:系统变数(又叫环境变数可在Shell中使用,也可在命令行用echo输出检视) $HOME--用户的工作目录 $PWD--当前目录 $PATH--执行命令时所搜寻的目录,可以用PATH=$PATH:New Path来增加 (注意, 若多个path中含有相同档案, 则以排在前面的path为准) $TZ--时区 $MAILCHECK--每隔多少秒检查是否有新的信件 $PS1--在命令列时的提示号 $PS2--当命令尚未打完时,Shell 要求再输入时的提示号 $MANPATH--man指令的搜寻路径 $TERM--你使用的终端类型 $LOGNAME--登录名 $LPDEST--用户默认的印表机,在LPDEST中设置的打印机会优先于系统管理员设置的系统范围内的默认打印机 $EDITOR--默认编辑器 $$ - 当前进程号 (使用PID在shell里取不出来, OS问题?) $PPID - 当前副进程号 $SHELL 查看自己所用 shell 路径.

【赞赏 / Reward】

微信         支付宝         PayPal

Post a comment