您的位置:首页 > 运维架构 > Shell

shell脚本的学习

2015-06-04 18:22 330 查看
一、脚本编程快速入门和概述

1.1区分大小写

UNIX是区分大小写的,依次shell脚本也区分大小写

1.2UNIX特殊字符

\ / ; , . ~ $ ? & * ( ) [ ] ' ' "+ - ! ^ =| < >

1.3shell

shell是一个能够用来运行命令、程序和脚本的环境。

Bourne /bin/sh或/usr/bin/sh

Bash /bin/Bash或/usr/bin/Bash

Korn /bin/ksh/或/usr/bin/ksh

1.4shell脚本

shell脚本的基本概念是一组命令,这些命令按照执行的顺序被列出。

注释以#开始,用来描述执行步骤

shell脚本和函数都是解释型的,他们不能被编译。

shell脚本和函数都是ASCII文本,可以有shell命令解释器读取。

1.5函数

在大多数情况下,函数是在shell脚本中定义或编写的,而且在脚本中被调用。

函数的具体形式如下:

function function_name

{

commands to execute

}



function_name()

{

commands to execute

}

脚本中使用函数之前必须对其进行声明或定义

1.6运行shell脚本

ksh shell_script_name(创建一个Korn shell,并执行shell_script_name)

一般在第一行对shell进行声明。

#!/bin/sh或#!/usr/bin/sh 声明一个Bourne shell

#!/bin/ksh或#!/usr/bin/ksh声明一个Korn shell

#!/bin/csh或#!/usr/bin/csh声明一个C shell

#!/bin/Bash或#!/usr/bin/Bash声明一个Bourne-Again(bash) shell

1.7shell脚本中的注释和风格

命令的可读性和逐步骤的注释是编写一个好脚本的基础。

包括描述变量和文件的用途,以及循环的作用。描述每个测试,还可能包括预期的结果,以及操作数据和许多数据字段的方式。当然在每行的注释之前要有一个#

1.8控制结构

if ... then 语句

if [ test_command ]

then

commands

fi

if...then...else语句

if [ test_command ]

then

commands

else

commands

fi

if...then..elif...(else)语句

if [ test_command ]
then
commands
elif [ test_command ]
then
commands
.
.
.
else
commands
fi
for...in 语句
for loop_variable in argument_list
do
commands

done

while语句

while test_condition_is_true
do
commands
done

until语句
until test_condition_is_true
do
commands
done

case 语句
case $variable in
match_1)
commands_to_execute_for_1
;;

match_2)
commands_to_execute_for_2
;;

match_3)
commands_to_execute_for_3
;;
.
.
.
*) (optional_any other value)
commands_to_execute_for_no_match
;;
esac
注意:
case语句的最后一部分是可选的
1.9使用break,continue,exit和return语句
break语句用于在结束执行该语句之前的所有代码行之后中断整个循环的执行。程序将继续执行位于循环体结尾处之后的代码
continue语句用于将控制转移到下一组代码,但是会继续执行循环。
exit语句将完成我们所预料的结果:退出整个脚本。可能会在exit命令之后加入一个整数(如 exit 0),该整数将作为返回代码发送给系统。
return语句用于在函数中将数据返回,或返回一个结果或代码给调用脚本

1.10here文档
here文档用于将输入重定向到某个交互式shell脚本或程序。
here文档的语法结构:
program_name <<LABEL
program_input_1
program_input_2
program_input_3

program_input_#

LABEL
1.11shell 脚本命令
shell脚本命令的基础是一系列命令的自动执行
passwd 修改用户密码
pwd 打印当前目录
cd 改变目录
ls 列出目录中的文件
wildcards 通配符*匹配任意数量的字符,通配符?匹配单个字符
file 打印文件类型
cat 显示文件内容
pr 显示文件内容
pg或page 一次显示一页文件内容
more 一次显示一页文件内容
clear 清除屏幕内容
cp或copy 复制文件
chown 修改文件的所有者
chgrp 修改文件的所在组
chmod 修改文件模式。权限
rm 将文件从系统中删除
mv 重命名文件
mkdir 创建一个mulu
rmdir 删除一个目录
grep 模式p匹配
egrep 扩展正则表达式的grep命令
find 定位文件和目录位置
>> 追加到文件末尾
> 重定向。创建或覆盖文件
| 管道符,连接不同命令
|| 逻辑或
& 后台执行
&& 逻辑与
date 显示系统日期和时间
echo 将字符串写入标准输出
sleep 将执行过程终端指定的秒数
wc 计算文件的单词 行和字符数
head 查看文件开头
tail 查看文件jiewei
diff 比较两个文件
sdiff 并行比较两个文件
spell 拼写检查
lp、lpr。enq。qprt
打印文件
lpstat 系统打印队列的状态
enable 启动或启动打印队列
disable 禁用或停止打印队列
cal 显示日历
who 显示系统用户信息
w 扩展的who命令
whoami 显示$LOGNAME或$USER环境变量
who am I 显示登陆名称、终端、登陆日期、时间和登陆位置
f、finger 显示用户登陆信息,包括user.plan和.project
talk 使两个用户能够进行分屏对话
write 在屏幕显示用户信息
wall 在屏幕上显示所用用户登录信息
rwall 向远程机所用用户显示信息
rsh或remsh
向远程机上执行一个命令或登录
df 显示文件系统统计数字
ps 显示当前运行的进程信息
netstat 显示网络状态
vmstat 显示虚拟内存状态
iostat 显示输入或输出状态
uname 显示当前操作系统名称和机器信息
sar 报告系统活动情况
basename 显示字符串参数的基本文件名
man 联机参考手册
su 转换到另一个用户,也称为超级用户
cut 写入所选字符
awk 解析字符的编程语言
sed 用于字符置换的编程语言
vi 启动vi编辑器
emacs 启动emacs编辑器

1.12符号命令
() 在一个子shell脚本里运行括号内的命令
(()) 在某个shell中对一个变量求职或赋值。并进行数学运算
$(()) 求括号内表达式的值
[] 同test命令
<> 用于字符串比较
$() 命令替换
'command' 命令替换

1.13变量
变量是可以进行赋值的字符串。赋给变量的值可以是数字、文本、文件名、设备或其他任何类型的数据。变量其实是一个纸箱实际数据的指针。
1.14命令行参数
命令行参数$1,$2,$3,///$9是位置参数,$0指向实际的命令、程序、shell脚本或函数,$1,$2,$3,///$9作为命令的参数

变量在函数或shell脚本中的克制范围成为变量的作用域

1.15shift命令
shift命令用于将位置参数向左移动
#!/usr/bin/sh

#

#SCRIPT:shft.sh

#

#AUTHOR:cyf

#

#REV:1.1.A

#

#PLATFORM:Not platform dependent

#

#PURPOSE:This script is used to process all of the tokens which

#are pointed to by the command-line arguments,$1,$2,$3,etc...

#

#REV.LIST:

#

#Initialize all variable

TOTAL=0#Initalize the TOTAL counter to zero

#Start a while loop

while true

do

TOTAL=`expr $TOTAL + 1` #A little math in the shell script ,a running
#total of tokens processed

TOKEN=$1 # we always point to the $1 argument with a shift

shift #Grab the next token,ie $2become $1

done

echo "Total number of tokens processed :$TOTAL"

1.16特殊参数$*和$@
特殊参数$*和$@允许一次访问所有的命令行参数。除非使用双引号将他们括起来,否则$*和%@具有相同的功能。
特殊参数$*指定了所有的命令行参数
特殊参数$@也指定了所有的命令行参数

特殊参数”$*“将整个参数列表作为一个参数来获取

特殊参数”$@“获取整个参数列表,并将其分割成不同的参数

1.17双引号”、符号‘和·
在允许字符替换或命令替换的语句中,可以使用双引号“,当定义一个包含空格数据的变量是,需要使用双引号
在不允许字符替换或命令替换的语句中,可以使用’,使用‘括起来的目的是希望在变量或命令语句中使用文字正文,而不进行任何替换,所以特殊字符的含义或功能都被去除了。
在希望执行某个命令或脚本并替换其输出结果的语句中,可以使用符号·
1.18在solaris中使用awk

1.19正确使用echo命令
使用echo命令显示文本。echo命令使用反斜杠操作符进行光标操作:\n控制光标到新的一行,\c控制光标继续在本行,\b控制光标后退,\t控制光标到下一个制表位\r控制光标返回,\v控制光标在各行间垂直移动。在Korn shell里,echo命令默认识别这些命令选项。在Bash shell里,必须给echo命令后面添加 -e
#set up the correct echo command usage. many Linux
#distributions will execute in bash even if the
#script specifies Korn shell .Bash shell requires
#we use echo -e when we use \n \c etc.
case $SHEEL in
*/bin/Bash)alias echo="echo -e"
;;
esac
1.20shell脚本中的数学
++--
+
-
!~
*/%
+-
<<>>
<=>=
==!=
&
^
|
&&
||
1.21内置的数学函数
abs
log
acos
sin
asin
sinh
cos
sqrt
cosh
tan
tanh
int
1.22文件权限。suid和sgid程序
可以使用chmod改变文件的权限
设置某个程序总是作为某个特定用户或某个特定用户或某个特定组的成员执行,这种方式通常用于所有的用户或某一些用户在适当的环境下运行某个程序。
4000 设置执行的用户ID
2000 设置执行的组ID
1000 设置目录的连接权限或设置文件的保存属性
0400 允许所有者读取
0200 允许所有者写入
0100 允许所有者执行或索索
0040 允许组读取
0020 允许组写入

0010 允许组执行或搜索

0004 允许其他人读取

0002 允许其他人写入

0001 允许其他人执行或搜索

1.23在远程主机上运行命令
在某个远程主机上执行命令并在本地显示结果
可以使用rsh命令来完成这一任务
rsh hostname command_to_execute
还有通过openssh,他是一个加密的自由软件
1.24设置陷阱
若某个程序在其正常结束之间种植,通常情况下,可以捕获到一个退出信号。该退出信号称为一个陷阱(trap)。
0 正常终止,脚本结束
1 SIGHUP
挂起,线路断开
2 SIGINT
终端中端,通常是Ctrl+C
3 SIGQUIT退出键,子进程在终止前死掉
9 SIGKILLkill -9 命令,不能捕获这种退出状态
15 SIGTERM
kill命令的默认操作
19 SIGSTOP停止,常为Ctrl+z
查看操作系统的所有退出信号
kill -l
在捕获到退出信号时。可以在退出shell脚本之前执行一些清理命令。
1.25用户信息命令
1.25.1who命令
可以给每个登陆用户提供:用户名、tty、登录时间、以及用户的登陆地点
1.25.2w命令
w实际上是一个扩展的who命令
1.25.3last命令
last命令可以显示从wtmp文件创建以来曾经登陆到系统的用户名单

1.26ps命令
ps 用户当前运行的进程
ps -f 用户当前运行进程的完整列表
ps -ef 除内核进程外所有进程的完整列表
ps -A 所有进程包括内核进程
ps -Kf 内核进程的完整列表
ps auxw
根据CPU的使用时间%CPU排序后显示的进程列表

1.27与用户通信
使系统用户或得信息的最常用的方式是使用/etc/motd文件,该文件在每次用户登录时显示
wall 在本地机上所有登录用户的屏幕上写入一条信息
rwall 在远程机上所有登录用户的屏幕上写入一条信息
write 写入一条信息给某个独立用户。用户必须是登录用户
talk 启动一个交互式程序,允许两个用户进行对话,屏幕被分割成两部分,用户双方可以看到对方输入的内容

1.28统一大写或小写文本以方便测试
tr和tpyeset命令可用于将文本大写或小写
大写
UPCASEVAR=$(echo $VARIAVLE | tr '[a-z]' '[A-Z]')
小写
DOWNCASEVAR=$(echo $VARIAVLE | tr '[a-z]' '[A-Z]')

用typeset命令来控制某个变量在shell中的属性。

typeset -u VARIABLE(用于将VARIABLE的大小写属性设置为总是转换大写
typeset -l VARABLE(用于将VARIABLE的大小写属性设置为总是转换为小写)

1.29检测返回代码
运行任何命令时,系统都会返回一个有关前一条被执行命令的响应,称为返回代码(return code)如果命令成功执行,则返回代码0
为了检测返回代码,可以查看$?shell变量

检测/usr/local/bin目录是否存在

test -d /usr/local/bin

if [ "$?" -eq 0 ]

then

echo '/usr/local/bin does exist'

else

echo '/usr/local/bim does not exist'

fi


if test -d /usr/local/bin

then

echo '/usr/local/bin does exist'

else

echo '/usr/local/bin does not exist'

fi


if [ -d /usr/local/bin ]

then

echo '/usr/local/bin does exist'

else

echo '/usr/local/bin dose not exist'

fi

1.30基于时间的脚本执行
可能需要编写许多希望定时运行或在某个程序特定的时间段运行的脚本。

1.30.1cron表
cron 表示一个系统文件,系统每分钟读取一次,而且将执行安排在改时间段执行的所有条目。在默认条件下,任何用户都可以使用crontab -e 命令来创建一个
cron表,但系统管理员可以通过cron.allow和cron.deny文件来控制允许那些用户创建和编辑cron表
crontab -l 列出当前用户的cron表的内容
*****
*
第一个Minute of the hour(0-59)
第二个hour of the day(0-23)
第三个day of the month(1-31)
第四个Moth of the year(1-12)
第五个day of the week(0-6)
第六个command to execute
通配符
*匹配任何数目的字符
? 匹配单个字符

1.30.2at命令
和cron表一样。at命令也可以根据时间来执行命令。
通过使用at命令,可以安排某个作业在特定时间运行一次。当作业执行时,at命令将发送一个关于标准输出和标准错误的电子邮件给安排该作业运行的用户(除非输出重定向)
可以通过at.allow和at.deny文件来控制允许哪些用户安排作业

为在10分钟后执行一个命令
echo '/usr/local/bin/somescript.Bash' | at now + 10 minutes

1.31输出控制
1.31.1静默运行
要以静默方式来执行一个脚本,可以使用以下语法
/PATH/script_name 2>&1 /dev/null
可以将文件描述符2指定的标准错误(stderr)重定向到文件描述符1指定的标准输出(stdout)然后,使用另一个到/dev/null的重定向,将所有的输出发送到位桶(bit bucket)
1.31.2使用getopts解析命令行参数
getopts内置于shell中,可以获取由单个字符所指定的有效命令行参数,单个字符前有一个减号-或加号+
getopts OptionString VARIABLE [Argument...]
SECS=0

MINUTES=0

HOURS=0

DAYS=0

PROCESS=0

while getopts :s:m:h:d:p: TIMED 2>/dev/null

do

case $TIMD in

s) SECS=$OPTARG

;;

m) ((MINUTES=$OPTARG*60))

;;

h) ((HOURS=$OPTARG*3600))

;;

d) ((DAYS=$OPARG*86400))

;;

p) PROCESS=$OPTARG

;;

\?) usage

exit 1

;;

esac

done

(( TOTAO_SECONDS=SECONDS+MINUTES+HOURS+DAYS))

1.31.3使用后台函数创建一个协作进程
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: