shell脚本学习与总结.docx

上传人:b****9 文档编号:23404701 上传时间:2023-05-16 格式:DOCX 页数:22 大小:24.83KB
下载 相关 举报
shell脚本学习与总结.docx_第1页
第1页 / 共22页
shell脚本学习与总结.docx_第2页
第2页 / 共22页
shell脚本学习与总结.docx_第3页
第3页 / 共22页
shell脚本学习与总结.docx_第4页
第4页 / 共22页
shell脚本学习与总结.docx_第5页
第5页 / 共22页
点击查看更多>>
下载资源
资源描述

shell脚本学习与总结.docx

《shell脚本学习与总结.docx》由会员分享,可在线阅读,更多相关《shell脚本学习与总结.docx(22页珍藏版)》请在冰豆网上搜索。

shell脚本学习与总结.docx

shell脚本学习与总结

shell脚本学习与总结

1.shell脚本是区分小写的

2.Unix特殊字符有:

(;$?

&*()[]`‘“+ 使用其时要进行转义()

3.Shell的注释以#开头

4.函数的定义

Functionfuction_name(){

Commandtoexecute

}

调用时直接用function_name.

5.控制结构

1)If...then语句

If[test_command]

Then

Commands

if

2)If...then...else语句

If[test_command]

Then

Commands

Else

commands

if

3)If...then...elif...then...(else)语句

If[test_command]

Then

Commands

Elif[test_command]

Then

Commands

Else

Commands

Fi

4)for...In语句

Forloop_varibleinargument_list

Do

Commands

done

5)while语句

Whiletest_command_is_true

Do

Commands

Done

6)until语句

Untiltest_command_is_true

Do

Commands

Done

7)case语句

Case$variablein

Match_1)

Commands_for_1Match_2)

Commands_for_2.

.

.

*)#optionforothervalues

Commands_for_no_matchesac

6.break、continue、exit和return语句

Break跳出整个循环体,然后执行循环体外接下来的代码;

Continue结束本次循环,继续下次循环;

Exit 退出整个脚本,一般在其后加入一个整数(如exit0),作为返回代码发送给系统;

Return 用于在函数中返回数据,或返回一个结果给调用函数

7.here文档

用于将输入重定向到某个交互式shell脚本或程序,而不需要用户介入。

Program_name<<LABLE

Program_input_1

Program_input_2

.

.

Program_input_#

LABLE

注意,程序输入行中的LABLE标记之间是没有空白的,且输入的必须是程序所期望的准确数据,否则可能会失效。

8.符号命令

() 在一个子shell中运行括号所括起来的命令

(())在某个shell中对变量进行求值和赋值,并进行数学运算

$(())对括起来的表达式进行求值

[]与test命令相同

[[]]用于字符串比较

$()命令替换

``命令替换

9.命令行参数

命令行参数$0,$1,$2,...,$9是位置参数,$0指向的是命令本身。

命令shift用于位置参数向左移动,如shift命令命令$2成为$1。

Shift加入一个数字来移动多个位置,如shift3使得$4成为$1。

shift是一种按照参数列出顺序来处理每个位置参数的良好方式。

10.特殊参数

$*指定所有的命令行参数,与$@的意义一样。

两者只有在加双引号时意义不同,如

“$*”将整个参数列表作为一个参数来获取,”$@”获取整个参数列表,并将它分隔成不同的参数。

$?

 检查返回代码。

一个成功执行完的命令返回代码为0,不成功是一个非0值。

11.双引号,单引号和`(esc下面的按键)

单引号''对内容进行全引用,也就是说,对变量工命令语句使用文字正文,不进行任何替换;而双引号则进行部分引用,则允许字符替换或命令替换。

`(esc下面的按键)用于执行某个命令或脚本并替换其输出结果,即命令替换,相同功能有$()。

此外,如果希望每次使用某个变量时重新读取它的值,也可使用它,如`$PWD`,则每次使用这个变量时都会重新读取它的新值。

12.文件权限和粘滞位(suid,sgid)

文件权限有读,写,执行三种权限。

将文件操作模式设为总是作为某个特定的用户(suid),或总是作为某个特定的组成员(sgid)来执行称为设置粘滞位。

可以用命令chmod进行修改文件权限。

13.在远程主机上运行命令

Sshuser@hostnamecommand_to_execute

如:

sshjack@192.168.1.3“uptime”

14.设置陷阱

当某个程序被迫中止时,会有一个退出信号,这个信号称为一个陷阱(trap)。

这样我们可以在捕捉到退出信号时执行命令,如捕获到退出信号1,2,3,15时退出:

Trap`echo“nEXITTINGonaTRAPPEDSINGAL”;exit`12315

注意不能捕获到kill-9.的退出信号。

15.查看用户信息

Who提供每个登录用户的用户名、tty、登录时间及用户登录地(IP)

W对who的扩展,包括作业进程时间,总用户进程时间等,但没有用户登录地信息。

Last显示自wtmp文件创建开始登录过的用户名单信息,包括登录时间,退出时间,tty等。

16.ps命令

显示当前系统进程的信息。

17.与用户通信

Wall,rwall,write,talk

18.大小写文本

用tr或typeset命令。

VALUES=“AFCDLD”

Echo$VALUES|tr‘[A-Z]'‘[a-z]'#将大写转换成小写;tr‘[a-z]'‘[A-Z]'则小写转换成大写

在VALUES前使用

Typeset-lVALUES#将大写转换成小写;typeset-u则小写转换成大写。

19.定时运行脚本cron

Crontab-e进入用户cron表添加定时脚本,如

在1月15日星期天0:

12执行脚本/usr/bin/test.sh

#分(0-59) 时(0-23)日(1-31)月(1-12)星期(0-6forSunday-saturday) 

1201510/usr/bin/test.sh

定时任务还可作用at命令。

20.输出控制

静默运行,即不输出任何内容到屏幕上:

 2>&1>/dev/null

输出到系统指定的控制台:

>/dev/console

21.解析命令行参数getopts

GetoptsoptionstringVARIABLE

Optionstring是所需的各种参数,用冒号隔开,如果不需要参数,则冒号可以省略。

如果optionstring前有一个冒号,则任何未匹配到时会在VARIBLE中加载一个?

使用getopts的作用是解析出参数,然后作用此参数做不同的操作。

如:

Whilegetopts:

s:

m:

h:

d:

p:

TM

Do

Case$TMin

S)

DosomethingM)

Dosomething.

.

.

?

Exit1Esac

22.逐行处理文件

WhilereadLINE

Do

Echo“$LINE”

Done<$FILENAME

23.作用select命令创建菜单

SelectmenuinYesNoQuit

Do

Case$menuin

Yes)

DosomethingNo)

DosomethingQuit)

Break*)

DosomethingEsac

doneshell脚本学习1,设置运行环境

在脚本的顶部写入:

#!

/bin/bash2,SHELL中变量与赋值str=hello

linux中变量不需定义,要用时直接赋值使用。

如:

str,注意等号两边不能有空格str=`ls-l/tmp/sh`如果要把某个命令的执行结果赋给某个变量时,=号右边要用``括起来

echo"$str"

查看变量的值,此处结果为:

hello3,从键盘输入字符或数值赋给指定的变量readname如:

从键盘输入lishi,则name的值为:

lishi4,"",'',``双引号,单引号,倒引号之间区别

echo"mynameis$name"

显示字符串,但含有转义字符引用其变量的值。

例中结果:

mynameistom

echo'mynameis$name'

把单引号中的内容原样显示出来,结果:

mynameis$name

echo`ls-l`

把倒引号中字符当作命令来执行,并把执行结果显示出来。

5,加,减,乖,除,求模运算。

注意要用倒引号括起来

expr`5+4`

expr`5-4`

expr`5\*4`

expr`5/4`

expr`5%4`

如果是在脚本里面进行运算时,倒引号要包括=号右边全部内容。

如:

sum=0sum=`expr$sum+1`6,对文本操作的命令

less能上下翻

more能一屏一屏的翻

head看文本的头10行参数-n5表示只显示头5行

tail看文本的尾10行,加-f参数,能实时看日志文件的变化。

如看tomcat日志文件变化。

tail-f/usr/tomcat/logs/canitsl.out

参数-n5表示只显示头5行7,$?

表示上一个命令是否正确执行,0表示正常,1表示错误

ls/tmp/hello,如果/tmp/下没有hello这个文件或目录。

则$?

为1,反之为08,./testlishiwangwu

$0程序名,$1第一个参数的名称,例中$0为test

$*参数组成的字符串,例中$*为lishiwangwu

$#传递给程序参数的总数目,例中$#为29,linux中变量分为全局环境变量和用户配置变量

全局环境变量针对系统中所有用户而设置的工作环境目录,在/etc/profile中

用户配置变量针对某一用户的。

在用户登录的目录下,.bash_profile中10,重定向重定向就是改变原来输入输出的方向,默认都是屏幕输出设备,键盘是输入设备。

“>”是输出重定向符。

“<”是输入重定向符。

“>”只存放正确的信息,“2>”存放错误的信息,每次存入前都会把之前文件内容清空再放入如:

ls/usr>/tmp/aaa把/usr目录下的所有文件和文件夹名称信息放到期/tmp/aaa文件中。

如:

ls/test2>/tmp/aaa如果没有/test文件夹,这时就会发生错误,那么2>就会把错误信息存入aaa文件中。

“>”能创建新文件,如:

>hello.java

“>”能清空一个文件如hello.java文件中有内容,我再>hello.java这时,hello.java内容清空“>>”双大于号在一起就变成了追加功能,在之前的文件内容后面追加内容。

如:

cat/tmp/sh>>/tmp/aaa把/tmp/sh目录中的所有文件和目录信息追加到aaa文件中。

aaa文件之前的内容不会被清除。

cat>hello.java时,能在屏幕上输入很多的内容,按ctrl+D时就会退出。

再cathello.java时

刚才输入的内容,全在hello.java文件中11,输入重定向如:

cat>a.txt<<EEE,从屏幕上输入内容到a.txt中,直到输入EEE时才结束!

!

!

!

像这种结合方式,经常被用在自动执行记录某些日志,或者写入信息时用到。

SYSPROFILE=/etc/profilecat>>$SYSPROFILE<<EOF

exportJAVA_HOME=/usr/java/jsdk

exportJAVA_OPTS="-Xms64m-Xmx768m"

exportPATH=$JAVA_HOME/bin:

$JAVA_HOME/jre/bin:

:

$PATH

exportCLASSPATH=.:

$JAVA_HOME/lib:

$JAVA_HOME/lib/dt.jar:

$JAVA_HOME/lib/tools.jar

EOF12,管道管道:

把前一个命令的输出作为下一个命令的输入。

顾名思义就是连接前后两个管道的作用。

把上一个管道的尾与下一个管道的头相连接。

ls-l/tmp/test|wc-l统计/tmp/test目录中共有多少个文件和目录。

把/tmp/test目录中文件和目录按列显示。

并把显示出来的结果作为wc-l命令的信息源。

13,条件判断语句字符串比较:

=,!

=,-n:

判断字符串长度是否大于0,大于0则为真,-z:

判断字符串长度是否等于0,等于0则为真

数字比较:

-eq相等,-ge大于等于,-le小于等于,-ne不等于,-gt大于,-lt小于

逻辑判断:

!

非,&&与,||或

文件判断:

-d目录判断,-f文件判断,-r可读,-w可写,-x可执行test条件1比较符条件2如:

test1-eq1

[条件1比较符条件2]如:

[1-eq1],[-n""]

[`who|wc-l`-le10]&&echo"YES"判断当前系统的登录用户数是否小于等于10,是,则输出YES

16,循环语句:

while条件为真时,执行

do

..

done例:

j=1

while((j<=10))或者while[j-le10]

do

echo"j=$j"

j=`expr$j+1

doneif语句:

if

then

else此处也可elif与fi再嵌套

fi例:

x=4;y=7if[$x-eq$y]

then

echo"相等"

else

echo"不相等"

ficase变量in

数值1)语句;;

数值2)语句;;

*)语句;;#如果数值不在范围之中,就执行这一行例:

USER=whoamicase$USERin

lishi)

echo"youareLISHI";

echo"Welcome";;

root)

echo"youareROOT"

echo"hiroot";;

admin)

echo"youareadmin";

echo"admin,hello";;*)echo"当前用户不是lishi,root,admin";;

esacfor循环例:

用FOR循环显示/tmp/sh目录中的每个文件信息。

变量i的取值是/tmp/sh目录中的每个文件如foriin"a""b""c",此时变量i每次循环的取值为a,b,cpath=/tmp/sh/

foriin`ls$path`

do

ls-l$i

done例:

#用for与if相结合的手法,显示出从1到键盘输入数之间的偶数

#注意if语句的双括号readx

for((i=1;i<=$x;i++))

do

if[$i%2==0]

then

echo"$i"

fi

done14,函数#定义一个累加的函数sum,再从键盘上输入两个数,再调用sum函数

#注意,函数一定要放在调用该函数的前面sum()

{

a=$x

b=$y

total=`expr$a+$b`

echo"total=$total"

}echo"pleaseentertwonumber:

"

readx

ready

sum$x,$y

shellstart:

shell有bsh,bash,cash等

1,在linux中管理员用户登录进去时,提示符为:

#,一般用户登录进去时的提示符为:

$

登录进去后,退出或要切换用户时,用:

exit命令,正常退出。

2,查看当前系统中的shell版本,在/etc/shell目录中查看。

3,在系统中查看不同用户默认的shell版本,/etc/passwd查看当前用户的shell,echoshell

4,直接用命令改变某个用户的shell环境:

chsh系统用户名,根据提示输入新shell路经,如:

/bin/bash

5,查看当前用户的环境变量和ID号,set|grepuser,set|grepuid或,查看/etc/passwd文件

6,查看某个命令在哪个位置which命令如:

whichifconfig当某些一般用户中有些命令提示无法找到

或执行时,一般是环境变量中没有把该命令的路经加进来。

用export命令设置环境变量

7,查看以前使用过的命令historyhistory-c清除之前使用过的命令

8,;在shell中用来区分一个命令的结束。

一行中可以多个命令

9,调试shell脚本用.脚本文件名或bash脚本文件名

10,文件权限分三类:

a,文件属主:

创建该文件的用户

b,同组用户:

拥有该文件的用户组中的任何用户

c,其它用户:

即不属于拥有该文件的用户组的某一用户

如:

-rwxr-xr-x1rootroot21708-1019:

51test1.sh

第一个字符表示文件的类型,是文件夹,还是普通文件例中-表示普通文件

后面的9个字符分三段,第一段是文件属主的权限

第二段是同组用户的权限,第三段是其它用户的权限

赋权限:

g是代表同组用户,o是代表其它用户

chmodgo+wx./test.sh给同组用户和其它用户赋写和执行的权限

chmodu+wr./test.sh给自己赋读和写权限

chmodo+wrx./test.sh给其它用户赋读,写和执行的权限

去权限与赋权限同理,只是把“+”换成“-”就可以了

chmodgo-rw./b.c把同组用户和其它用户读和写的权限去除

11,一般权限也可以用数字表示:

4:

读,2:

写,1:

执行,

如果用数字给某一个文件赋权限,要写3段数字,如:

764,则表示

用户自己是读写执行,同组用户是读写,其它用户是读的权限。

12,给文件和文件夹赋权限时,两者互不干扰,除非在给文件夹赋权限时带-R参数

那么,该文件夹下的所有内容就赋予了和文件夹一样的权限了,小心使用-R

13,查看文件夹权限时,用:

ll-d/tmp/sh-d是查看文件夹的,不然只会

列出该文件夹的内容了。

14,改变文件的所属用户,chownoracle/tmp/sh/api.sh

改变文件的所属组,chown:

oracle/tmp/sh/api.sh

同时,改变文件的所属用户和组,chownoracle:

dba/tmp/sh/api.sh那么api.sh的所属用户和组信息为:

-rwxrwxr-x1oracledba26407-2815:

57/tmp/sh/api.sh

15,id命令,查看当前是哪个用户,以及哪个组的相当信息

16,groups查看系统当前有多少个组,groups用户名如:

groupsoracle,查看用户所属组

17,getentgroup组名如:

getentgroupdba查看dba组中有哪些用户

18,创建一个用户并把它加入到指定组中useraddwangcai-Groot

19,当一个脚本需要以拥有者或组的用户执行时,需要用到suid,guid

文件设置了suid或guid时,如果该文件没有执行权限,那么设置suid或guid时就没有意思,会用大写"S"

表示。

4代表suid,2代表guid

如:

start-orcl.sh例子,首先用chown改变文件所属用户,再用chmod改变文件suid和guid的权限

-rwxr-xr-x1rootroot63208-1517:

31start-orcl.sh

chownoraclestart-orcl.sh

-rwxr-xr-x1oracleroot63208-1517:

31start-orcl.sh

chmod6751start-orcl.sh

-rwsr-s--x1oracleroot63208-1517:

31start-orcl.sh

20,用指定的用户身份执行一个脚本su-oracle-c"/tmp/sh/start-orcl.sh"

以oracle的身份执行start-orcl.sh这个脚本

21,创建快捷方式ln-s/tmp/sh1创建快捷方式1指向/tmp/sh,访问1相当于访问/tmp/sh一样。

22,定时任务:

用servicecrondstatus查看cron服务状态,如果没有启动则servicecrondstart启动它。

基本用法:

crontab-l

列出当前的crontab任务

crontab-d

删除当前的crontab任务

crontab-e(solaris5.8上面是crontab-r)

编辑一个crontab任务,ctrl_D结束

crontabfilename

crontab的格式为:

分时日月星期命令(中间用空格隔开)。

crontab文件的条目是从左边读起的,第一列是分,以此类推,最后一列是需要执行的命令。

每一列称为crontab的一个域,在这些域中,可以用-来连接一个时间范围,例如星期一到星期五,可以用1-5来表示。

单个时间点可以用,号分隔,比如星期一和星期四,那么可以表示为1,4。

如果某个表示时间的域没有特别限制,可以用*号表示。

每一个时间条目包含5个域,用空格隔开。

比如我希望每天晚上21:

30运行bin目录下的cleanup.sh文件,那么该命令就应该为:

3021***/app/bin/cleanup.sh(注意:

由于不需要限定日期、月份、星期,所以日期、月份和星期域用*号表示)

比如我希望每月得1、10、20的00:

00运行backup.sh文件,那么命令应该为:

00001,10,20**/app/bin/backup.sh(注意:

由于不需要限定月份和星期,所以月份和星期域用*号表示)

#每两个小时

0*/2***date

crontab-e然后在打开的文件中编辑内容,如:

0*/2***date,保存退出。

也可以把如:

0*/2***date的内容,放到一个filename文件中,再用crontabfilename

把内容加到crontab中,这时用crontab-l也可以看到filename文件中的内容。

让配置文件生效:

如果让配置文件生效,还得重新启动cron,切记,既然每个用户下的cron配置文件修改后。

也要重新启动cron服务器,/etc/init.d/crondrestart。

编辑/etc/crontab文件,在末尾加上一行:

305***rootinit6这样就将系统配置为了每天早上5点30自动重新启动。

需要将crond设置为系统启动后自动启动的服务,可以在/etc/rc.d/rc.local

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 人文社科 > 广告传媒

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1