Aixshell 入门.docx
- 文档编号:23812500
- 上传时间:2023-05-21
- 格式:DOCX
- 页数:17
- 大小:23.86KB
Aixshell 入门.docx
《Aixshell 入门.docx》由会员分享,可在线阅读,更多相关《Aixshell 入门.docx(17页珍藏版)》请在冰豆网上搜索。
Aixshell入门
所有的UNIX®用户都应该了解如何使用KornShell脚本。
通过编写Shell脚本,可以让您实现许多任务的自动化,并可以为您节约大量的时间。
初看起来,它似乎令人生畏,但只要遵循正确的指导,您就可以熟练地使用它。
本文将指导您编写自己的KornShell脚本。
什么是Shell?
IBM®AIX®操作系统和其他的类UNIX操作系统一样,都需要通过某种方式与内核进行通信。
这项任务正是通过使用Shell来实现的。
您可以使用各种不同的Shell,但本文重点关注于KornShell。
KornShell是AIX所使用的缺省Shell。
当您登录到AIX中时,将以某个目录的提示符作为开始。
缺省目录通常是您的home目录。
之所以将其称为home目录,是因为该目录的结构通常如下所示:
$/home/jthomas:
当登录时,您将处于命令行或者命令提示符处。
这正是您输入UNIX命令的地方。
您可以输入与UNIX内核进行交互的Shell命令。
这些命令可能简单到只有一行(比如查看日期),也可能为多行,而这取决于您所进行的操作。
清单1提供了一些示例命令。
清单1.示例命令
$date
FriMay122:
59:
28EDT2008
$uptime
10:
59PMup259days,9:
44,5users,loadaverage:
3.81,14.27,13.71
$hostname
gonzo
有关Shell命令的最棒的一项功能是,您可以将多个命令组合在一个称为脚本的文件中,它允许您依次运行多个命令。
当您必须一次又一次重复地运行相同的命令时,使用脚本非常合适。
您可以将这些命令放到一个KornShell脚本中,而无需反复地键入这些命令。
编写您的第一个KornShell脚本
KornShell脚本中的第一行是Shell自身。
它被表示为下面的形式:
#!
/bin/ksh
要在AIX中编写KornShell脚本,您需要使用一种文本编辑器。
vi是一种使用最广泛、且随处可见的文本编辑器。
开始接触时可能会觉得有点麻烦,但随着使用vi的次数的增多,您将熟练地掌握它。
关于如何使用vi文本编辑器,人们撰写了很多相关的书籍。
要开始编写您的第一个KornShell脚本,首先需要打开vi编辑器,并添加Shell名称作为第一行。
完成这项操作之后,您需要构建某种类型的脚本标头,用来告诉编写脚本的用户,该脚本将执行什么操作,以及该脚本的编写时间。
您可以对脚本进行任意地命名,但通常使用扩展名.ksh来表示KornShell脚本。
您并不是必须要这样做,但这是一种很好的做法。
镑符号(#)可用于对脚本进行注释,如清单2中所示。
清单2.脚本标头的示例
$vimy_first_script.ksh
#!
/bin/ksh
###################################################
#WrittenBy:
JasonThomas
#Purpose:
Thisscriptwaswrittentoshowusershowtodeveloptheirfirstscript
#May1,2008
###################################################
这个脚本标头非常简单,但它应用了上述的技巧。
回页首
变量
在脚本中设置变量是相当简单的。
我通常使用大写形式来表示脚本内的所有变量,如清单3所示,但您不需要这样做。
清单3.变量的示例
#DefineVariables
HOME="/home/jthomas"#Simplehomedirectory
DATE=$(date)#SetDATEequaltotheoutputofrunningtheshellcommanddate
HOSTNAME=$(hostname)#SetHOSTNAMEequaltotheoutputofthehostnamecommand
PASSWORD_FILE="/etc/passwd"#SetAIXpasswordfilepath
回页首
KornShell的具体细节
到目前为止,作为编写KornShell脚本的入门内容,您已经了解了如何编写基本的脚本标头,以及定义变量。
现在,您可以开始编写一些KornShell代码了。
让我们开始从某个文件中读取一些行。
在这个示例中,使用您已经在脚本中定义过的/etc/passwd文件,并且仅打印用户名称,如清单4中所示。
清单4.for循环
$vimy_first_script.ksh
#!
/bin/ksh
###################################################
#WrittenBy:
JasonThomas
#Purpose:
Thisscriptwaswrittentoshowusershowtodeveloptheirfirstscript
#May1,2008
###################################################
#DefineVariables
HOME="/home/jthomas"#Simplehomedirectory
DATE=$(date)#SetDATEequaltotheoutputofrunningtheshellcommanddate
HOSTNAME=$(hostname)#SetHOSTNAMEequaltotheoutputofthehostnamecommand
PASSWORD_FILE="/etc/passwd"#SetAIXpasswordfilepath
#BeginCode
forusernamein$(cat$PASSWORD_FILE|cut-f1-d:
)
do
print$username
done
这种语法形式被称为for循环。
它允许您打开/etc/passwd文件,并且每次读取其中的一行内容,仅截取文件中的第一个字段,然后打印这行内容。
请注意这个特殊字符:
|。
我们称其为管道。
管道允许您将一个命令的输出重定向到另一个命令。
在保存该脚本之后,您可以运行它,如清单5中所示。
清单5.运行脚本
$./my_first_script.ksh
root
daemon
bin
sys
adm
uucp
nobody
lpd
该脚本开始将输出打印到屏幕上。
或者,您可以通过进行下面的操作仅将输出打印到一个文件中:
print$username>>/tmp/usernames
>>告诉打印命令仅将每个用户名依次追加到一个文件中。
通过进行这项操作,在您的终端中将不会再显示相应的文本。
您还可以通过使用下面的命令,将输出同时打印到屏幕和文件中:
print$username|tee–a/tmp/usernames
tee命令允许您同时将输出重定向到终端和文件。
您刚刚了解了如何使用for循环读取文件的内容,以及如何仅截取用户名、并将输出重定向到文件或者终端。
回页首
错误检查
如果开始的时候/etc/passwd文件并不存在,那么会发生什么情况呢?
简单来说,该脚本将会失败。
清单6显示了用来检查该文件是否存在的语法。
清单6.用来检查某文件是否存在的语法
#BeginCode
if[[-e$PASSWORD_FILE]];then#Checktoseeifthefileexistsandifsothencontinue
forusernamein$(cat$PASSWORD_FILE|cut-f1-d:
)
do
print$username
done
else
print"$PASSWORD_FILEwasnotfound"
exit
fi
这一小段代码显示了条件型if语句。
如果/etc/passwd文件存在,那么该脚本将继续执行。
如果这个文件不存在,那么该脚本将在终端屏幕上打印"/etc/passwdfilewasnotfound",然后退出。
条件型if语句以if开头,以反写的字母(fi)结尾。
回页首
美元问号符($?
)
每当您在AIX中运行一个命令时,系统将设置一个变量,它通常被称为美元问号符。
AIX将这个变量设置为零,以表示成功;设置为非零,以表示失败。
这对于KornShell脚本来说是非常有用的。
清单7介绍了当您运行有效和无效的AIX命令时查看$?
变量的设置。
清单7.针对有效和无效AIX命令,如何设置$?
$date
SatMay1000:
02:
31EDT2008
$echo$?
0
$uptime
12:
02AMup259days,10:
47,5users,loadaverage:
4.71,10.44,12.62
$echo$?
0
$IBM
ksh:
IBM:
notfound.
$echo$?
127
$aix
ksh:
aix:
notfound.
$echo$?
127
$ls-l/etc/password
ls:
0653-341Thefile/etc/passworddoesnotexist.
$echo$?
2
在编写KornShell脚本时,这是非常有价值的,因为它向您提供了另一种检查错误的方式。
下面是用于检查/etc/passwd文件是否存在的另一种不同的方式:
#BeginCode
PASSWORD_FILE="/etc/passwd"
ls–l$PASSWORD_FILE>/dev/null2>&1
这个命令允许您列出该文件。
然而,您并不是真的在意这个文件是否存在。
对于您来说,重要的是获得该命令的返回代码。
大于符号>允许您对该命令的输出进行重定向。
在本文稍后的内容中,您将了解更多有关重定向输出的信息。
清单8显示了如何在脚本中使用$?
。
清单8.在脚本中使用$?
#BeginCode
PASSWORD_FILE="/etc/passwd"
ls–l$PASSWORD_FILE>/dev/null2>&1
if[[$?
!
=0]];then
print“$PASSWORD_FILEwasnotfound"
exit
else
forusernamein$(cat$PASSWORD_FILE|cut-f1-d:
)
do
print$username
done
fi
我尝试了列出该文件,而不是实际地进行检查,以判断该文件是否存在。
如果您可以列出该文件,则表示该文件存在。
如果您无法列出该文件,则表示该文件不存在。
在AIX中可以通过使用ls¨Clfilename命令列出文件。
这项操作使得您可以通过检查$?
变量来测试AIX命令是否成功执行。
回页首
标准输入、输出和错误
您真的需要了解这些内容。
一般说来,主要存在三个输入和输出源。
在AIX中,它们分别称为STDIN、STDOUT和STDERR。
STDIN指的是您可能从键盘获得的输入。
STDOUT是执行一个命令时打印到屏幕上的输出。
STDERR则对应于一个命令失败时的屏幕输出。
STDIN、STDOUT和STDERR的文件描述符分别映射到数值0、1和2。
如果希望检查一个命令成功或者失败,那么您可以进行类似清单9中的操作。
清单9.将输出重定向到STDOUT和STDERR
$date>/dev/null2&&1#Anyoutputfromthiscommandshouldneverbeseen
if[[$?
=0]];then
print"Thedatecommandwassuccessful"
else
print"Thedatecommandfailed
fi
这段代码运行了AIX中的date命令。
您应该不会看到任何来自STDOUT(文件描述符1)或者STDERR(文件描述符2)的输出。
然后,您使用条件型if语句,以检查该命令的返回代码。
如前所述,如果该命令返回零,那么该命令的执行是成功的;如果它返回的是非零,那么它的执行是失败的。
回页首
函数
在KornShell脚本中,单词function是一个保留字。
可以使用函数将脚本划分为多个部分。
在您调用函数时,仅运行相应的片断。
在已编写的代码的基础上,创建一个错误检查函数,如清单10所示。
清单10.错误检查函数
##################
functionif_error
##################
{
if[[$?
-ne0]];then#checkreturncodepassedtofunction
print"$1"#ifrc>0thenprinterrormsgandquit
exit$?
fi
}
如果我希望在脚本中运行一个简单命令,那么我可以简单地编写一些类似于上面$?
的错误检查代码。
每当我希望检查某些操作是否失败时,我还可以仅调用if_error函数,如清单11所示。
清单11.调用if_error函数
rm–rf/tmp/file#Deletefile
if_error"Error:
Failedremovingfile/tmp/file"
mkdir/tmp/test#Createthedirectorytest
if_error"Error:
Failedtryingtocreatedirectory/tmp/test"
每当运行上面的任何一个命令时,就会调用一次if_error函数。
对应于该特定错误检查的消息将传递给if_error函数。
这一点很重要,因为它允许您编写一次Shell脚本代码,却可以一次又一次地使用它。
这样可以更快、更简单地编写Shell脚本。
回页首
case语句
case语句是另一种条件型语句,您可以用该语句来替代if语句。
case语句以case开头,并且以反写的(esac)结尾。
当您的脚本变得比较复杂、并且需要执行不同的任务时,可以使用case语句迅速地进行构建。
清单12提供了一个示例。
清单12.case语句
casevaluein
"Mypattern")commandstoexecute
whenvaluematches
Mypattern
;;
esac
假设您希望在某天中不同的时刻删除一个文件。
那么您可以创建一个变量,用于检查具体的时刻:
TIME=$(date+%H%M)
清单13中所显示的代码将在晚上10:
00和晚上11:
00删除某个文件。
因此,每次执行这个代码段的时候,将检查$TIME是否匹配case语句所指定的时间。
如果匹配,那么将执行相应的代码。
清单13.用于检查时间的case语句
case$TIMEin
"2200")#Thismeans10:
00
rm–rf/tmp/file1
;;
"2300")#Thismeans11:
00
rm–rf/tmp/file1
;;
"*")
echo"Donothing">/dev/null
;;
esac
回页首
综合使用完整的脚本
到目前为止,您已经创建了一个脚本标头和一些简单变量,并且添加了一个函数,如清单14所示。
清单14.示例Kornshell脚本
$vimy_second_script.ksh
#!
/bin/ksh
###################################################
#WrittenBy:
JasonThomas
#Purpose:
Thisscriptwaswrittentoshowusershowtodeveloptheirfirstscript
#May1,2008
###################################################
#DefineVariables
HOME="/home/jthomas"#Simplehomedirectory
TIME=$(date+%H%M)#SetDATEequaltotheoutputofrunningtheshellcommanddate
HOSTNAME=$(hostname)#SetHOSTNAMEequaltotheoutputofthehostnamecommand
##################
functionif_error
##################
{
if[[$?
-ne0]];then#checkreturncodepassedtofunction
print"$1"#ifrc>0thenprinterrormsgandquit
exit$?
fi
}
if[[-e/tmp/file]];then#Checktoseeifthefileexistsfirst
rm–rf/tmp/file#Deletefile
if_error"Error:
Failedremovingfile/tmp/file"
else
print"/tmp/filedoesn’texist"
fi
if[[-e/tmp/test]];then
mkdir/tmp/test#Createthedirectorytest
if_error"Error:
Failedtryingtocreatedirectory/tmp/test"
else
print"Directoryexists,noneedtocreatedirectory"
fi
case$TIMEin
"2200")
rm–rf/tmp/file1
;;
"2300")
rm–rf/tmp/file1
;;
#EndScript
要运行这个脚本,您只需要键入./scriptname.ksh,如下所示:
$./my_second_script.ksh
回页首
在命令行中将输入传递给某个脚本
您可以创建相应的脚本,以允许将输入传递到其中。
请参见清单15。
清单15.将输入传递到脚本中
#!
/bin/ksh
OPTION=$1
print"Ilove$OPTION"
$./scriptnamemilk
Ilovemilk
$./scriptnametea
Ilovetea
$./scriptname"peanutbutter"
Ilovepeanutbutter
任何时候将信息传递到脚本中时,在脚本名之后的第一个选项称为$1。
在脚本名之后的第二个选项称为$2,以此类推。
这种编写脚本的方式非常好,因为这样一来,它更像是带有一些开关或者选项的UNIX命令。
回页首
在脚本中发送电子邮件
您可以使用脚本来生成某些类型的报告。
例如,可能编写了某个脚本来对每天添加到系统中的新用户进行跟踪。
这个脚本可以将输出写入到某个文件中,然后您可以将该文件发送给自己。
通过这种方式,您可以获得每天添加到系统中的所有新用户的统计信息的副本。
要实现这一点,可以运行下面的命令:
$REPORT="/tmp/users"
cat$REPORT|mailx–s"UseradminreportfromserverXYZ"Jason_Thomas@kitzune
这项操作将向您发送一封$REPORT文件内容的电子邮件。
-s将作为该电子邮件的主题。
这项功能使用起来的确非常方便。
回页首
结束语
KornShell脚本可以为您节约大量的时间,并使您的工作更加轻松。
初看起来,它似乎令人生畏,但请记住,应该始终从简单之处入手,分别构建相应的脚本。
请始终遵循同样的步骤:
构建您的脚本标头,定义变量,然后对您的工作进行错误检查。
您可能会发现,您希望为所进行的每项工作编写脚本。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Aixshell 入门