发新话题
打印

AIX技术专栏1:什么是shell

AIX技术专栏1:什么是shell

AIX技术专栏1:什么是shell --ZZ

写在前面:我一直有一个想法,要把我工作几年来的经验总结一下,但总是没有动力来完成它。现在,我给自己施加了一些压力,希望我能坚持下去,完成我的专栏。如果我的文章对大家能够有所帮助,我会感到非常的高兴。
下面的专栏,是我参照几本英文资料,并融入我个人的经验写成的。因为我本人水平有限,如有不确切的地方请大家批评指正。因为我有自己的工作,只能在工作间歇来完成写作,不一定每天都能推出新东西,请大家谅解。也欢迎其他高手也推出自己的专栏,把我们的论坛办成国内一流的技术论坛。
如要转载,请与我联系。


什么是shell?
操作系统与外部最主要的接口就叫做shell。shell是操作系统最外面的一层。shell管理你与操作系统之间的交互:等待你输入,向操作系统解释你的输入,并且处理各种各样的操作系统的输出结果。
shell提供了你与操作系统之间通讯的方式。这种通讯可以以交互方式(从键盘输入,并且可以立即得到响应),或者以shell script(非交互)方式执行。shell script是放在文件中的一串shell和操作系统命令,它们可以被重复使用。本质上,shell script是命令行命令简单的组合到一个文件里面。

交互式shell和非交互式shell
交互式模式就是shell等待你的输入,并且执行你提交的命令。这种模式被称作交互式是因为shell与用户进行交互。这种模式也是大多数用户非常熟悉的:登录、执行一些命令、签退。当你签退后,shell也终止了。
shell也可以运行在另外一种模式:非交互式模式。在这种模式下,shell不与你进行交互,而是读取存放在文件中的命令,并且执行它们。当它读到文件的结尾,shell也就终止了。

shell的类型
在UNIX中主要有两大类shell
Bourne shell (包括 sh, ksh, and bash)
Bourne shell ( sh)
Korn shell ( ksh)
Bourne Again shell ( bash)
POSIX shell ( sh)
C shell (包括 csh and tcsh)
C shell ( csh)
TENEX/TOPS C shell ( tcsh)

Bourne Shell
最初的UNIX shell是由Stephen R. Bourne于20世纪70年代中期在新泽西的AT&T贝尔实验室编写的,这就是Bourne shell。Bourne shell 是一个交换式的命令解释器和命令编程语言。Bourne shell 可以运行为login shell或者login shell的子shell(subshell)。只有login命令可以调用Bourne shell作为一个login shell。此时,shell先读取/etc/profile文件和$HOME/.profile文件。/etc/profile文件为所有的用户定制环境,$HOME/.profile文件为本用户定制环境。最后,shell会等待读取你的输入。

C Shell
Bill Joy于20世纪80年代早期,在Berkeley的加利福尼亚大学开发了C shell。它主要是为了让用户更容易的使用交互式功能,并把ALGOL风格的语法结构变成了C语言风格。它新增了命令历史、别名、文件名替换、作业控制等功能。

Korn Shell
有很长一段时间,只有两类shell供人们选择,Bourne shell用来编程,C shell用来交互。为了改变这种状况,AT&T的bell实验室David Korn开发了Korn shell。ksh结合了所有的C shell的交互式特性,并融入了Bourne shell的语法。因此,Korn shell广受用户的欢迎。它还新增了数学计算,进程协作(coprocess)、行内编辑(inline editing)等功能。Korn Shell 是一个交互式的命令解释器和命令编程语言.它符合POSIX——一个操作系统的国际标准.POSIX不是一个操作系统,而是一个目标在于应用程序的移植性的标准——在源程序一级跨越多种平台。

Bourne Again Shell (bash)
bash是GNU计划的一部分,用来替代Bourne shell。它用于基于GNU的系统如Linux.大多数的Linux(Red Hat, Slackware, Caldera)都以bash作为缺省的shell,并且运行sh时,其实调用的是bash。

POSIX Shell
POSIX shell 是Korn shell的一个变种. 当前提供POSIX shell的最大卖主是Hewlett-Packard。在HP-UX 11.0 , POSIX shell 就是/bin/sh,而bsh是/usr/old/bin/sh.

各主要操作系统下缺省的shell:
AIX 下是Korn Shell.
Solaris和FreeBSD缺省的是Bourne shell.
HP-UX缺省的是POSIX shell.
Linux是Bourne Again shell.

【TIP】
#!/usr/bin/sh的用途
shell script的第一行一般都是#!/usr/bin/sh或#!/usr/bin/ksh等,它的用途就是指出本脚本是用的哪种shell写的,执行时系统应该用哪种shell来解释执行它。

TOP

AIX技术专栏2:korn shell基础知识--ZZ

Korn Shell执行命令的顺序
1.关键字,如if,for,function等
2.别名(Aliases)
3.内部命令,如cd, whence和函数等
4.函数Functions
5.脚本Scripts、在PATH中的可执行程序
※找矫畹母从孟旅娴拿睿?br /> whence -v command
或:
type command


Alias(别名)
alias aliasname=command
取消一个别名:
unalias aliasname
列出当前所有的别名:
alias
【TIP】
用来显式当前目录下的所有目录的别名:alias ldir='ls -l|grep ^d'
提问:alias|grep ^ls会看到:ls=/usr/bin/ls,请问:系统为什么要定义这个别名?


Functions(函数)
定义的位置:
Function可以在命令行、.kshrc(ENV文件,见下篇)或在shell script中定义
定义的方法:
function funcname {
shell commands
}
或:
funcname () {
shell commands
}
列出所有当前的functions
functions
取消一个function
unset -f funcname
输出一个function:
typeset -fx funcname
取消输出一个function:
typeset +fx funcname
※function是"typeset -f"的预定义的别名

Korn Shell 的选项
Korn Shell有一些选项,如果在.kshrc(ENV文件,见下篇)中设定他们,那么他们就是全局的,并且可以传递给subshell。
列出所有的Korn Shell选项:
set -o
设置一个选项
set -o OptionName
取消一个选项
set +o OptionName
Korn Shell 选项的意义
allexport 自动export随后定义地所有变量(文件名中不含有.).(等于set -a)
errexit 如果一个命令的返回值不为0,就执行错误陷阱(ERR trap)。但对profile文件例外。(等于set -e)
bgnice 后台进程以较低的优先级运行,这是缺省值
emacs 使用emacs风格的行内编辑器
gmacs 使用gmacs风格的行内编辑器
ignoreeof 遇到文件结束符时不退出shell。要想退出shell必须使用exit命令或者敲Ctrl-D 11次。
keyword 为了保持与Bourne shell的兼容性。(set -k)
markdirs 在完成文件名替换后在目录名后面加一个斜线(/)。
monitor Runs background jobs in a separate process and prints a line upon completion. (set -m)
noclobber 不能用>重定向符覆盖已经存在的文件。只能用>|来重写已经存在的文件。noexec 读入命令只检查它的语法但不执行。 (set -n)
noglob 禁止文件名替换。(set -f)
nolog 不在历史文件中保存函数的定义。
nounset 在试图扩展没有定义的变量时显示错误信息。(set -u)
privileged 禁止执行HOME/.profile file 并且使用/etc/suid _profile 而不是ENV文件。 (set -p)
verbose 显示shell读入的输入.(set -v)
trackall Designates each command as a tracked alias when first encountered.(set -h)
vi 使用vi风格的行内编辑器
viraw Processes each character as it is typed in vi mode.
xtrace 在运行命令前,先显示命令.(set -x)
※举例:使vi成为inline editor
set -o vi

Debuging(调试)
调试一个shell script的方法:
#set -o xtrace
然后再运行shell
或者直接执行
#ksh -x shellprog args

#sh -v shellprog args
Debug 一个function
#typeset -ft funcname

Prompts(提示)
PS1 主shell提示符(普通用户缺省是 $,而root缺省是#)
PS2 继续提示符( 缺省 > )
什么是继续提示符?
在命令行上输入
for i in 11 12 13 14 15 16
do
lspv hdisk$i
done
从第二行开始,屏幕最左面就是继续提示符。
PS3 在选择循环中的选择提示符(缺省是 #? )
PS4 调试提示符 (缺省是 + )
【tip】:命令行上提示主机名称和当前目录
export PS1="[`hostname`-"'$PWD]'
注意:一定是""包括``才能取得命令的结果,''包括变量才能随时更改变量的值
效果:
[hostname-/tmp]

【NEXT】定制你的环境

TOP

AIX技术专栏3:定制你的环境 --zz

定制shell环境
当你登录时,shell会读取以前设置的初始化文件来设置用户环境。用户环境的定义是通过设置环境变量来实现的。当登录操作系统时,shell主要使用两大类profile文件来定义用户环境。一类是用来为所有用户定制环境,另一类是为个人定义自己的环境。
登录时,shell首先执行/etc/profile文件中的命令,然后运行/etc/environment文件中的命令来设置你的系统环境。这两个文件运行完毕后,系统会接着检查在你的home目录下是否有.profile文件,如果.porfile文件存在,就运行它。 .profile文件还会指出是否还有一个环境文件。如果还有环境文件(通常叫.env或者.kshrc)存在,系统会运行这个文件,并设置你的环境变量。

/etc/profile文件
用户在登录时,操作系统定制用户环境时使用的第一个文件就是/etc/profile。这个文件控制着全系统范围内的缺省变量,如Export变量,文件创建的掩码,终端类型,以及新邮件到达时的提示信息等等。
系统管理员为所有用户配置porfile文件,只有系统管理员可以更改这个文件。

/etc/environment文件
在登录时操作系统使用的第二个文件是/etc/environment。/etc/environment文件包含为所有进程所配置基本环境的变量。当一个新进程开始时,exec子程序生成一个形为Name=Value的字符串数组。这个字符串数组被称为环境,每一个被定义名字被称作环境变量或者shell变量。exec子程序允许整个环境一次设置完成。
当你登录时,系统在读取你自己的profile前,设置环境文件的环境变量。下面是构成基本环境的变量:
HOME:用户登录的或HOME全路径,登录程序从/etc/passwd文件中读取并设置它。
LANG:语言环境
NLSPATH:消息目录的全路径。
LOCPATH:国际语言支持系统表格的全路径
PATH:搜寻命令的目录
TZ:时区信息  IBM不想吃中国饭了?到现在还得用TAIST——台北时区
【注意】/etc/environment文件中不能包含命令

.profile文件
操作系统在登录时用到的第三个文件是.profile文件。 .profile文件位于用户的home目录,它允许用户定制自己的个人的工作环境。
在登录程序将LOGNAME和HOME变量添加到环境中后,$HOME/.profile文件中的命令就会被执行,.porfile文件中含有你个人的设置会忽略/etc/profile文件中的相矛盾的变量。
一般用.profile来控制下面的缺省值:
打开的shell,命令行提示符,键盘的声音。

.env文件
如果你在.profile文件中有如下内容:ENV=$HOME/.env,操作系统在用户登录时使用的第四个文件是.env文件。.env文件允许用户定制自己的个人的工作环境。文件中含有的你个人的环境变量会忽略/etc/environment文件中的相矛盾的变量。
【注意】/etc/profile,/etc/environment和.profile文件只在登录时运行一次。但是.env文件却在每一次打开一个新shell或一个窗口时都被执行。
【TIP】$HOME/.env文件名可以任意,但在$HOME/.profile中要有相应的声明:export ENV=$HOME/.NewName
【TIP】$HOME/.env文件每当一个子shell被开启都会被执行,所以可以在这里定义在vi中开启的子shell中也可以使用的别名。
【注意】这四个定制环境的文件中,/etc/enviroment文件中只能给变量赋值,而其它三个文件可以使用语句。



建议在/etc/profile中加入一行:
set -o vi

此命令在ksh下运行,所以为确保命令正确完成,最好先运行ksh

EDITOR=vi效果也一样

TOP

AIX专题4:变量 --zz

定义变量:
ValueName=value

访问变量:
$ValueName
${ValueName}

定义与初始化数组变量:
set -A name value1 value2 ... valuen
或直接给数组赋值也可以定义数组:
name[index]=value

访问数组变量:
${name[index]}

一次访问数组变量中的所有元素:
${name
}
${name[@]}

只读变量:
内部命令readonly可以标志某个变量为只读,标志完成后,此变量就不能再被更改。
命令格式:
readonly VariableName

删除变量:
内部变量unset可以用来删除已经不再需要使用的变量。命令格式:
unset VariableName

当shell在运行时,共有三大类变量:
局部变量:局部变量只存在于shell的当前实例中,在它所启动的子shell中并不存在.
环境变量:环境变量是指对所有shell所启动的程序都有效的变量.
shell变量:shell变量是一类特殊的变量.它是由shell而设定,shell需要它正确地运行.
如:PWD,HOME,RANDOM,SECONDS等等。

输出一个环境变量:
局部变量可以通过export命令变为环境变量。
方法1:
VariableName=Value;export VariableName
方法2(ksh,bash):
export VariableName=Value

TOP

AIX(shell部分)专栏5:参数--zz

Parameters(参数)
通常调用UNIX程序的格式是:
command options files

一些与传递给shell的参数相关的变量:
$# 命令行参数的个数
$? 调用命令的返回值
$$ 当前进程的进程号
$! 最后一个后台命令的进程号
$0 命令行的第一个参数,也就是命令名
$n 命令行的第n个参数,如果要取超过9个参数${n}
$* 所有的命令行参数,等于("$1 $2...")
"$@" 所有的命令行参数,等于("$1" "$2"...)
$_ 前一个命令的最后一个命令行参数

shell脚本的选项(option)解析
一般有两种主要的方法来分析传递给shell script的选项(option)。第一种方法是利用上述的shell variables和shift等命令,配合case命令来直接分析,在参数的个数比较少的情况下,这种方法比较常用。但如果参数数量比较多,就需要使用getopts命令。
命令格式:
getopts option-string variable
getops解析命令行传递的参数的处理过程为:
1.getopts检查所有的命令行参数,查找以字符"-"开始的参数。
2.当找到以字符"-"开始的参数,将 "-"之后的字符串和option-string比较。
3.如果找到符合的匹配,则指定的变量被设置,否则,此变量被设成?字符。
4.重复1到3,直到所有的选项被处理。
5.当分析结束,getopts返回一个非0返回值,这常用做循环的判断条件。另外,当getopts结束时,它还将变量OPTIND设为最后一个参数的下标。
【注意】当选项后面需要跟一个附加的参数时(如-i intputfile),在option-string中需要在相应的option中加冒号(如i: )。在这种情况下,当解析到此选项时,附加的参数会被赋值给OPTARG变量。
举例:
下面的shell清单将能够分析:
-i 指定输入的文件名
-o 指定输出的文件名
-v 指定使用详细模式
shell script清单:
#!/usr/bin/ksh
USAGE="Usage: $0 '[-v] [-i] [filename] [-o] [filename]'"
VERBOSE=false

while getopts o:f:v OPTION ; do
case "$OPTION" in
o) OUTFILE="$OPTARG" ;;
i) INFILE="$OPTARG" ;;
v) VERBOSE=true ;;
\?) echo "$USAGE" ;
exit 1
;;
esac
done
echo Output file is $OUTFILE
echo Input file is $INFILE
echo In VERBOSE ModeVERBOSE

TOP

AIX(shell部分)专栏6:数学计算--zz

在korn shell中进行数学计算有许多方法,常用的有:
1.使用赋值语句:
格式:
let 赋值表达式
【tip】赋值表达式可以省略为: ((赋值表达式))
例:给自变量i加1
let i=i+1

((i=i+1))

2.使用expr命令:
例:给自变量i加1
i=`expr $i + 1`

3.使用bc命令:
bc是UNIX下的计算器,它也可以用在命令行下面:
例:给自变量i加1
i=`echo $i + 1|bc`
※因为bc支持科学计算,所以这种方法功能非常强大

4.整数运算还可以使用整数变量直接进行计算
例如:
typeset -i A=1 B=3
A=A+B
echo $A
结果为4
※在新版本的Korn Shell中(如:Version M-12/28/93f)直接支持integer,float等数据类型;而AIX(4.3.2、4.3.3、5.1等)下的korn shell版本都是Version M-11/16/88f,不支持float数据类型,integer数据类型需要用typeset -i来定义。

TOP

支持

TOP

发新话题