编写shell管理脚本_第1页
编写shell管理脚本_第2页
编写shell管理脚本_第3页
编写shell管理脚本_第4页
编写shell管理脚本_第5页
已阅读5页,还剩153页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

编写shell管理脚本:

shell的作用:

Shell是一个特殊的应用程序,它介于操作系统内核与用户之间,负责接收用户输入的操作

指令并进行解释,将需要执行的操作传递给内核执行。

Shell程序有很多种,windows里的cmd.exe也是shell的一种。

在linux/unix操作系统中,能够使用的shell程序有很多种,常见的shell如下:

Bsh:早期的unixshell程序,实现了最基本的命令解释其功能。

Csh:使用C语言的语法风格,更加适合为用户提供命令交互操作。

Ksh:结合了bsh和csh两者的功能优势。

Bash;是bsh的升级替代品,目前大多数linux默认的shell程序。

Zsh:更多的基于交互式操作系统考虑设计。

Shell环境的切换:

通过配置文件/etc/shells可以了解系统所支持的shell程序的路径。

查看当前linux系统中能够使用的shell程序的列表:

[root@localhost~]#cat/etc/shells

/bin/sh

/bin/bash

/sbin/nologin

/bin/dash

/bin/tcsh

/bin/csh

[root@localhost

有一部分shell程序实际上是其他shell程序的符号链接文件:

[root@test~]#Is-I/bin/*sh

-rwxr-xr-x.1rootroot938832Jul182013/bin/bash

Irwxrwxrwx.1rootroot4Jun2422:11/bin/csh->tcsh(tcsh是csh的兼容升级版本)

-rwxr-xr-x.1rootroot109672Oct172012/bin/dash

Irwxrwxrwx.1rootroot4Jun2422:05/bin/sh->bash

-rwxr-xr-x.1rootroot387328Feb222013/bin/tcsh

[root@test

1.临时切换到新的shell环境:

直接输入其他shell程序的名称即可切换到新的shell环境,返回原来的shell可执行exit

命令:

[root@testtcsh

[root@test~]#

查看当前用户所用的shell:

[root@enscript]#echo$SHELL

/bin/bash

[root@enscript]#

[root@test^]#echo$0(并不是所有shell都支持)

tcsh

[root@test~]#

[root@testexit

exit

[root@test~]#echo$0

-bash

[root@test~]#

2.更改用户自己的登陆shell:

用户登录shell信息记录在/etc/passwd文件中。用户可以用chsh命令进行修改:

[root@localhostgrep"root"/etc/passwd

root:x:Q:0:root:/root:/bin/bash

operators:11:0:operator:/root:/sbin/nologin

[root@localhost~]#

普通用户更改自己的shell方法:

使用dwzhang用户登录,更改自己的shell为tcsh:

[dwzhang@test~]$echo$0

-bash

[dwzhang@test~]$chsh

Changingshellfordwzhang.

Password:

Newshell[/bin/bash]:/bin/tcsh

Shellchanged.

[dwzhang@test~]$echo$0

-bash

[dwzhang@test~]$grepdwzhang/etc/passwd

dwzhang:x:500:500::/home/dwzhang:/bin/tcsh

[dwzhang@test~]$

重新连接:

[dwzhang@test~]$echo$0

-tcsh

[dwzhang@test~]$

管理员root账户更改shell:

管理员直接vi编辑/etc/passwd,直接更改用户shell.

用命令usermod进行更改:

[root@localhost~]#usermod-s/bin/bashdwzhangl

bash问题:

考试题:如何查看centoslinux系统默认的shell?

[root@testecho$SHELL

/bin/bash

[root@test

查看shell版本:

[root@testbash-version

shell程序在运维工作中的作用地位?

shell脚本很擅长处理纯文本类型的数据,而linux中几乎所有的配置文件,日志文件都是纯

文本类型的文件。贴近系统层的操作,shell是最佳。

shell脚本语言的种类:

在unix和linux中主要有两大类shell:

bourneshell(包括sh,ksh,bash)

cshell(包括csh,tcsh)

bash是最常用的,也是linux默认的shell解释器。

常用的开发脚本语言:

php:网页程序,主要用来做web程序。

perl:强大,语法复杂。

python:新兴的语言,语法简洁。

sh和bash的区别:

sh是bash的软链接:

[root@testIs-I/bin/sh

Irwxrwxrwx.1rootroot4Jun2422:05/bin/sh->bash

[root@test

Bash的常用功能:

1.命令历史

(1)使用历史命令

可用方向键上来使用执行过的命令。

⑵查看或修改历史命令列表

命令history默认情况下可以为用户保存最多1000条历史命令,若要更改需修改/etc/profile

文件中的“HISTSIZE=1000”实现。

[root@localhostvi/etc/profile

HISTSIZE=1000

[root@localhost

为特定用户调整历史用户命令:

[dwzhang@test~]$vi.bash_profile

exportHISTSIZE=20(添加这一行)

[dwzhang@test~]$history|wc-I

76

重新登录:

[dwzhang@test~]$history|wc-I

20

[dwzhang@test~]$

清除历史命令:

[root@localhost~]#history-c

2.命令别名:

查看系统已设置的别名:

[root@localhost~]#alias

aliascp='cp-i'

aliasl.='ls-d.*-color=auto'

aliasll='ls-I-color=auto'

aliasls='ls-color=auto'

aliasmv='mv-i'

aliasrm='rm-i'

aliaswhich='alias|/usr/bin/which-tty-only-read-alias-show-dot-show-tilde'

[root@localhost^]#

设置别名命令:(重启后失效)(长期更改应更改文件.bashrc)

基本形式:alias别名实际命令’

取消设置别名:

命令unalias

Unalias别名名称

[root@localhostunaliasrm

取消当前系统所有设置的命令别名:

[root@localhostunalias-a

标准输出重定向:

是将命令输出结果定向(保存)到指定的文件中,而不是直接显示在显示器的屏幕上。

输出重定向使用符号:

符号>:如果指定的文件不存在,则会建立新文件,结果保存到该文件中。

如果该文件存在,则清空文件内容并保存结果到该文件。

[root@localhostidzhangl>idzhangl.txt

[root@localhostIs

anaconda-ks.cfgidzhangl.txtinstall.loginstall.log.syslog公共的模板视频图片

文档下载音乐桌面

[root@localhostcatidzhangl.txt

uid=500(zhangl)gid=500(zhangl)组=500(zhangl)

[root@localhost~]#

符号”:可以将结果追加到指定文件末尾进行保存,而不覆盖文件的原有内容。如果想把多

个命令输出结果保存在一个文件中,可以使用此命令。

[root@localhostidzhang2»idzhangl.txt

[root@localhostcatidzhangl.txt

uid=500(zhangl)gid=500(zhangl)组=500(zhangl)

uid=501(zhang2)gid=501(zhang2)组=501(zhang2)

[root@localhost~]#

标准输入重定向:

是将命令中接收输入的途径由默认的键盘更改为指定的文件。

使用输入重定向将使一些交互式操作过程可以通过读取文件来完成。

比如为用户设置密码的过程需要交互,比如安装vmwaretools等。

为用户设置密码,结合-stdin命令和〈重定向符,则可自动读取文件设置密码。省略啦交互

的过程。

[root@localhostvipw.txt

[root@localhostcatpw.txt

lqaz2wsx!@

[root@localhostpasswd-stdinzhang3<pw.txt

passwd:未知的用户名称'zhang3'o

[root@localhostuseraddzhang3

[root@localhostpasswd-stdinzhang3<pw.txt

标准错误重定向:

就是将执行命令过程中出现的错误信息(如选项参数错误等)重新定向保存到指定文件,而

不是直接显示在屏幕上。

使用操作符2>o其中2是错误文件的编号。2>>:不覆盖旧的文件。

[root@localhost~]#helpIs

bash:help:nohelptopicsmatch'Is'.Try'helphelp'or'man-kIs1or'infoIs'.

[root@localhosthelpIs2>err.txt

[root@localhost~]#caterr.txt

bash:help:nohelptopicsmatch'Is'.Try'helphelp'or'man-kIs'or'infoIs'.

[root@localhost~]#

在实际应用中,错误重定向主要是提供以下用途:

1.在调试程序时,收集错误信息。

2.使用shell脚本程序时,将错误重定向到指定文件中。

当命令执行结果中同时包含标准输出(正常执行)和错误输出的内容时,可以同时用〉,2>

将信息分别重定向到不同的文件。也可以用&>操作符将两种输出内容重定向到同一个文件

中。

管道操作:

在bash环境中,管道操作作为不同命令之间的协同工作提供了一种机制。位于管道“|”左

侧的命令输出结果,将作为右侧命令的输入,同一行命令中可以依次使用多个管道。

输入/输出重定向、管道

程序的默认输入设备,叫标准输入,stdin,键盘01

程序的默认输出设备,叫标准输出,stdout,minitor显示器。2

程序的默认错误信息输出设备,标准错误输出,stderr,minitor。3

输出重定向:

>,大于号表示。

COMMAND>FILE,覆盖输出,冲掉原来的内容。

[root@localhostIs/>/tmp/test.out

[root@localhostIs/tmp/test.out

/tmp/test.out

[root@localhost~]#

[root@localhostpwd>aa

[root@localhostcataa

/root

[root@localhost

可以用命令关掉输出重定向这个功能:

命令:set-C(关闭输出重定向。set+C开启,>|强行覆盖,-C无效,大C)

[root@localhostset-C

[root@localhostset+C

[root@localhost^]#ls/>|aa(强行覆盖)

COMMAND»FILE,追加输出。

>>,两个大于号。

[root@localhostcataa

/root

[root@localhost~]#Is/»aa

[root@localhostcataa

/root

bin

boot

dev..............................

[root@localhost

/dev/null的意义

数据黑洞,送进去的数据丢弃,把不想要的输出信息丢弃到/dev/null中。这里单个大于号

或追加输出都无所谓了。

[root@localhostdate

FriSep1211:12:01CST2014

[root@localhost~]#date>/dev/null《丢弃输出内容,只想看命令是否成功)

[root@localhost^]#echo$?(查看输入是否成功)

0

[root@localhost

输入重定向:

<,小于号。

COMMAND<FILE

是将命令中接收输入的途径由默认的键盘更改为指定的文件。

使用输入重定向将使一些交互式操作过程可以通过读取文件来完成。

比如为用户设置密码的过程需要交互,比如安装vmwaretools等。

为用户设置密码,结合-stdin命令和〈重定向符,则可自动读取文件设置密码。省略啦交互

的过程。

[root@localhost~]#vipw.txt

[root@localhost~]#catpw.txt

lqaz2wsx!@

[root@localhostpasswd-stdinzhang3<pw.txt

passwd:未知的用户名称'zhang3'c

[root@localhostuseraddzhang3

[root@localhostpasswd-stdinzhang3<pw.txt

«»两个小于号:

COMMAND«,文件结尾标示符,(出现此标示即结束)

例子:把hellozhang

helloda

hellowei一次写入文件中。

方法1:一行一行追加

[root@localhost~]#echo"hellozhang',>testl

[root@localhost~]#echo"helloda"»testl

[root@localhost~]#echo"hellowei"»testl

[root@localhost~]#cattestl

hellozhang

helloda

hellowei

[root@localhost^]#

方法2:利用・e和\n下一行功能

[root@localhostecho-e"hellozhang\nhelloda\nhellowei">test2

[root@localhost~]#cattest2

hellozhang

helloda

hellowei

[root@localhost~]#

方法3:用<<两个小于号

[root@localhost~]#cat»test3«eof(输入eof结束)

>hellozhang

>helloda

>hellowei

>eof(遇到eof结束)

[root@localhostcattest3

hellozhang

helloda

hellowei

[root@localhost~]#

<<用在脚本中:

[root@localhost~]#vimtest4.sh

#!/bin/bash

cat«eof

whatdoyouwanttoeat?

l.shaoji

2.longxia

3.dazhaxie

eof

[root@localhostbashtest4.sh

whatdoyouwanttoeat?

l.shaoji

2.longxia

3.dazhaxie

[root@localhost

错误输出:

就算重定向一个命令,如果命令是错误的,也是没有重定向。

例子:

[root@localhostIls/etc>testl

-bash:Ils:commandnotfound

[root@localhost^]#

2>:

把错误信息追加到文件:

[root@localhostIls/etc2>testl

[root@localhostcattestl

-bash:Ils:commandnotfound

[root@localhost~]#

正确或错误都重定向:

COMMAND>FILE2>&1

COMMAND>FILE12>FILE2(把对的输出到FILE1文件中,错误输入到FILE2中)

COMMAND&>FILE(无论对错都输出到文件中)

管道:

把第一个命令结果送给第二个命令。

COMMAND1|COMMAND2|......................

[root@localhostecho"welcomezhangdawei"

welcomezhangdawei

[root@localhost^]#echo"welcomezhangdawei"|tr'a-z''A-Z'(用大写字母显示)

WELCOMEZHANGDAWEI

[root@localhost~]#echo"welcomezhangdawei"|cut-d''-f2(只显示第二个字符)

zhangdawei

[root@localhost~]#echo"welcomezhangdawei"|cut-d''-fl

welcome

[root@localhostREC='echo"welcomezhangdawei"|cut-d''-fl'

[root@localhost~]#echo$REC

welcome

[root@localhost~]#

显示/etc下文件大写显示:

[root@localhostIs/etc|tr'a-z''A-Z*|less

[root@localhostlog]#pwd

/var/log

[root@localhostlog]#

[root@localhostlog]#file'Is/var/log'

anaconda.ifcfg.log:ASCIItext

anaconda.log:ASCIIEnglishtext

[root@localhostlog]#file'Is/var/log'|tr-d'1(tr-d',删除空格字符)

anaconda.ifcfg.log:ASCIItext

anaconda.log:ASCIIEnglishtext

[root@localhostlog]#file'Is/var/log'|sort(排序)

anaconda.ifcfg.log:ASCIItext

anaconda.log:ASCIIEnglishtext

[root@localhostlog]#file'Is/var/log'|cut-d:-f2(显示第二个字符)

ASCIItext

ASCIIEnglishtext

[root@localhostlog]#file'Is/var/log'|cut-d:-f2|tr-d11|sort-u(sort-u去掉重复的选项)

ASCIIC++programtext,withverylonglines

ASCIIEnglishtext

想显示命令并且保存一份命令结果:

tee命令

COMMAND|teefile|COMMAND

[root@localhostlog]#Is/etc|teetest51查看/etc并把结果保存到test5文件中)

Shell变量应用:

用于保存系统和用户需要特定参数,而且这些参数可以根据用户的设定或系统环境的变化而

相应变化。

常见的shell变量类型:用户自定义变量(本地变量),环境变量(全局变量),预定义变量,

位置变量。

用户自定义变量:

是由系统用户自己定义的变量,只在用户自己的shell环境中有效,又称为本地变量。

1.定义新的变量

格式:变量名=变量值

新建一个名为“DAY”的变量,初始内容设置为"Sunday"

[root@localhost~]#DAY=Sunday

[root@localhost~]#

2.查看和引用变量的值

通过在变量名前加“$”,可以引用一个变量的内容。需要在终端中输出变量内容,可以

使用echo命令。

查看变量DAY的内容,比较使用$和不使用的区别:

[root@localhost~]#DAY=Sunday

[root@localhost~]#echoDAY(错误用法,直接显示输入字符)

DAY

[root@localhost~]#echo$DAY(弓I用DAY变量的内容)

Sunday

[root@localhost

当变量名称和紧跟着其后的其他字符相浑浊时,需要加{}大括号,将变量名包围起来。

[root@localhost~]#DAY=Sunday

[root@localhost~]#echo$DAYmoring(错误用法,显示空行)

[root@localhostecho${DAY}moring(正确引用DAY变量的内容)

Sundaymoring

[root@localhost~]#

[root@testjintian=wensday

[root@test~]#echo$jintian

wensday

[root@testechojintianshi${jintian}(注意$要放在中括号外面${jintian})

jintianshiwensday

[root@test~]#

这种变量的方式是直接定义变量内容,内容一般为简单连续的数字,字符串,路径名等。

3.为变量赋值的常用方法:

上面说的在=号后面直接指定变量内容是为变量赋值的基本方法,除此之外,比较常用

的几种变量赋值操作包括:双引号,单引号,反撇号,read命令。

双引号(”〃)

使用双引号时,可以再双引号的范围内使用$符号来引用其他变量的值。

确认变量DAY的内容,并使用双引号为TODAY变量值"todayis$DAY":

[root@localhostecho$DAY

Sunday

[root@localhosttoday="todayis$DAY"

[root@localhost~]#echo$today

todayisSunday

[root@localhost~]#

这种变量的方式是通过双引号定义变量,特点是输出变量时引号里的变量会经过解析后输

出的变量内容,不是把引号内容输出,适合于字符串中附带有变量的内容。

单引号(“)

使用单引号时,将不可以在单引号范围内引用其他变量的值,$将会被当成普通字符。

确认变量的内容DAY,并使用单引号为today变量赋值弋。dayis$DAY"

[root@localhost~]#echo$DAY

Sunday

[root@localhosttoday='todayis$DAY'

[root@localhost~]#echo$today

todayis$DAY

[root@localhost^]#

这种变量的方式是通过单引号定义变量,特点是单引号里面是什么就输出什么,比较适合

定义显示纯字符串。

例子:

[root@test3=

[root@testb='192.168・l.2'

[root@testc=,,"

[root@testecho$a

[root@test~]#echo$b

[root@test~]#echo$c

[root@test~]#

[root@testa=-$a

[root@testb='-$a'

[root@testc=H-$a"

[root@test**]#echo"a=$a"

3=-

[root@test~]#echo,,b=$b"

b=-$a

[root@test~]#echo"c=${c}"

c=--

[root@test~]#

对于不连续的字符串定义要用双引号,否则系统提示没有这个命令:

[root@testa="bcd"

[root@testecho$a

bed

[root@test~]#d=fdg

-bash:d:commandnotfound

[root@test

反撇号(,、)

使用反撇号时,可以将执行的特定命令的输出结果赋给变量,反撇号内包含的字串必须是能

够执行的命令,执行后会用输出结果替换该命令字串。

用命令II查看,将结果保存到变量aa中:

[root@localhost~]#aa='ll'(给aa一个可以执行命令的变量II查看命令)

[root@localhost~]#echo$aa(查看结果)

总用量112-rw-------.1rootroot13544月922:48anaconda-ks.cfg-rw-r-r—.1rootroot854

月2309:18err.txt-rw-r-r-.1rootroot964月2210:55idzhangl.txt-rw-r-r-.1rootroot

450644月922:48install.log-rw-r-r-.1rootroot100334月922:46install.log.syslog-rw-r-r-.

1rootroot114月2211:05pw.txtdrwxr-xr-x.2rootroot40964月914:50公共的drwxr-xr-x.

2rootroot40964月914:50模板drwxr-xr-x.2rootroot40964月914:50视频drwxr-xr-x.

2rootroot40964月914:50图片drwxr-xr-x.2rootroot40964月914:50文档drwxr-xr-x.

2rootroot40964月914:50下载drwxr-xr-x.2rootroot40964月914:50音乐drwxr-xr-x.

2rootroot40964月914:50桌面

[root@localhost~]#

在需要嵌套使用命令替换操作时,反撇号将力所不能,这时需使用“$()"来代替:

[root@localhost~]#bb=$(ll$(mkdirvvb))(给bb变量,创建文件夹vvb,查看II)

[root@localhost~]#echo$bb

总用量124-rw-r-r-.1rootroot7354月2311:11aa.txtdrwxr-xr-x.2rootroot40964月23

11:17abc-rw-------.1rootroot13544月922:48anaconda-ks.cfg-rw-r-r-.1rootroot854月

2309:18err.txt-rw-r-r-.1rootroot964月2210:55idzhangl.txt-rw-r-r-.1rootroot450644

月922:48install.log-rw-r-r-.1rootroot100334月922:46install.log.syslog-rw-r-r-.1root

root114月2211:05pw.txtdrwxr-xr-x.2rootroot40964月2311:18vvbdrwxr-xr-x.2root

root40964月914:50公共的drwxr-xr-x.2rootroot40964月914:50模板drwxr-xr-x.2

rootroot40964月914:50视频drwxr-xr-x.2rootroot40964月914:50图片drwxr-xr-x.2

rootroot40964月914:50文档drwxr-xr-x.2rootroot40964月914:50下载drwxr-xr-x.2

rootroot40964月914:50音乐drwxr-xr-x.2rootroot40964月914:50桌面

[root@localhost

命令read是bash内置命令来给变量赋值

[root@localhost^]#readzhang(赋值给变量zhang)

zhangdawei(输入内容)

[root@localhostecho$zhang(查看变量zhang)

zhangdawei

[root@localhost

4.设置变量的作用范围:

对于用户自行定义的变量,默认只能在当前的shell环境中使用,因此称为局部变量。

为了能在所有子shell环境中能够继续使用,可以使用export命令将指定的变量设置为“全

局变量”。可以同时使用多个变量名,不需要$符号,多个变量用空格分开。

[root@localhost~]#filesvr=

[root@localhostecho$filesvr

[root@localhost~]#zsh

[root@localhost~]#echo$filesvr

[root@localhost~]#exit

[root@localhostexportfilesvr

[root@localhostzsh

[root@localhostecho$filesvr

[root@localhost~]#

定义两个变量MONTH,YEAR,并将其设置成全局变量。

[root@localhost~]#exportM0NTH=mayYEAR=2009

[root@localhostecho$MONTH$YEAR

may2009

[root@localhost

例子说明:

[root@test~]#zdw=zhangdawei(定义变量zdw)

[root@test~]#echo$zdw(echo查看变量)

zhangdawei

[root@testcsh(切换到csh)

[root@testecho$zdw(查看zdw变量)

zdw:Undefinedvariable.(显示未定义的变量)

[root@testecho$0(查看当前shell)

csh

[root@testexit(退出)

exit

[root@testexportzdw(用命令export指定变量zdw为全局变量)

[root@testcsh(切换到csh)

[root@testecho$zdw(查看zdw变量内容)

zhangdawei

[root@test

5.清除自定义变量:

当用户不再需要使用自定义变量时,可以使用unset命令对已定义的用户变量进行清除,

指定一个或多个变量名称作为参数即可。(以空格分开)

[root@localhost~]#exportM0NTH=mayYEAR=2009

[root@localhost~]#echo$M0NTH$YEAR

may2009

[root@localhostunsetMONTHYEAR(注意:删除变量不用加$)

[root@localhost~]#echo$MONTH$YEAR

[root@localhost~]#

6.数值变量的运算:

Bash程序并不适合进行强大的数学运算(如小数,指数等),一般只适合进行简单地整

数运算.可以使用expr表达式命令:

格式如下:expr变量1运算符变量2【运算符变量3......]

其中变量1,变量2.......对应需计算的数值变量(前面需要加$符号引用),常用的几种运

算符:

+:加法运算

-:减法运算

\*:乘法运算

/:除法运算

%:求模运算,又称为取余运算,即计算数值相除后的余数。

第一种方法:用let:

[root@enscript]#a=2

[root@enscript]#b=6

[root@enscript]#c=$a+$b

[root@enscript]#echo$c

2+6

[root@enscript]#letc=$a+$b

[root@enscript]#echo$c

8

[root@enscript]#

第二种方法:用$[算数表达式]

[root@enscript]#a=5

[root@enscript]#b=5

[root@enscript]#w=$[$a+$b]

[root@enscript]#echo$w

10

[root@enscript]#

第三种方法:用$((算数表达式)),2个小括号:

[root@enscript]#n=8

[root@enscript]#m=6

[root@enscript]#p=$(($n+$m))

[root@enscript]#echo$p

14

[root@enscript]#

第四种方法:用expr算术表达式,注意数字之间要有空格,要用''引号:

[root@enscript]#f=7

[root@enscript]#s=9

[root@enscript]#x='expr$f+$s'(注意:'expr空格$f空格+空格$s')

[root@enscript]#echo$x

16

[root@enscript]#

环境变量:

这里所说的环境变量是指用户登陆后linux系统预先设定好的一类shell变量,其功能是设

置用户的shell工作环境,包括用户宿主目录,命令查找路径,用户当前目录,登陆终端等。

通常使用大写字母,数字和其他字符组成。一般由linux系统自行维护。

1.查看环境变量

通常不带任何选项或参数的set命令,可以查看系统中的所有的shell变量。

[root@localhost~]#set|less

BASH=/bin/bash

BASHOPTS=checkwinsize:cmdhist:expand_aliases:extquote:force_fignore:host

complete:interactive_comments:progcomp:promptvars:sourcepath

BASH_ALIASES=()

BASH_ARGC=()

BASH_ARGV=()

BASH_CMDS=()

BASH_LINENO=()

BASH_SOURCE=()

比较常用的环境变量:

$USER,$LOGNAME变量表示当前用户登陆的名称,$UID变量表示当前用户的UID号,

$SHELL变量表示用户使用的登陆shell,$HOME变量表示用户的宿主目录,$PWD变量表示

用户当前的工作目录等。

$PATH变量表示当前用户的命令搜索路径。

以分号分割,显示当前用户的用户名,宿主目录,登陆shell。

[root@localhost~]#echo"$USER:$HOME:$SHELL"

root:/root:/bin/bash

[root@localhost

查看当前的命令搜索路径,并将“/opt/bin”目录添加到现有的搜索路径中去:

[dwzhang@test~]$echo$PATH

/usr/lib64/qt-3.3/bin:/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/dwz

hang/bin

[dwzhang@test~]$PATH=7opt/bin:$PATH"

[dwzhang@test~]$echo$PATH

/opt/bin:/usr/lib64/qt-3.3/bin:/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/h

ome/dwzhang/bin

[dwzhang@test~]$

2.环境变量配置文件

/etc/profile:全局配置文件,对所有用户起作用。

.bash_profile:用户配置文件,可以覆盖全局配置。

用户需要长期变更所使用的某个环境变量,可以再.bash_profile中修改。

在当前用户环境中,将用于限制历史命令查看数量的环境变量HISTSIZE的值改为900。

[root@localhost~]#echo$HISTSIZE(查看环境变量)

1000

[root@localhostexportHISTSIZE=900(设置全局变量改为900)

[root@localhostecho$HISTSIZE(查看变量)

900

[root@localhost

位置变量:

$n:获取当前执行的shell脚本的第n个参数值,n=1..9,当n为0时表示脚本的文件

名,如果n大于9,用大括号括起来${10}

例子:

[root@testdayl]#catn.sh

echo$1$2$3

[root@testdayl]#shn.shxiaolxiao2xiao3

xiaolxiao2xiao3(分别对应$1,$2,$3)

[root@testdayl]#

[root@testdayl]#catn.sh

echo$1$2$3${10}

[root@testdayl]#shn.sh1234567891011

12310

[root@testdayl]#

预定义变量:(特殊变量)

是由bash程序预先定义好的一些特殊变量,用户只能使用预定义变量,而不能创建新的预

定义变量。所有的预定义变量都是由$符号和另一个符号组成的,较常用的有:

$0:获取当前执行的shell脚本的文件名,包括路径。(表示当前执行的进程的进程名)

例子:

[root@testdayl]#catO.sh

echo$0

[root@testdayl]#shO.sh(显示脚本的名称)

0.sh

[root@testdayl]#sh/scripts/dayl/O.sh

/scripts/dayl/O.sh(显示脚本名和路径)

[root@testdayl]#

[root@testdayl]#cat/etc/init.d/postfix(查看postfix脚本文件)

echo$"Usage:$0{start|stop|restart|reload|abort|flush|check|status|condrestart}"

[root@testdayl]#/etc/init.d/postfixxiaozhang(执行一下)

Usage:/etc/init.d/postfix{start|stop|restart|reload|abort|flush|check|status|condrestart}

[root@testdayl]#(提示文件名和路径)

如果脚本需要使用脚本名,直接定义$0,不需要在定义参数。

有的时候我们不需要路径和脚本名同时显示:需要用命令dirname和basename:

[root@testdayl]#dirname/scripts/dayl/O.sh(路径)

/scripts/dayl

[root@testdayl]#basename/scripts/dayl/O.sh(脚本名)

O.sh

[root@testdayl]#

[root@testdayl]#cat00.sh

dirname"$0"

basename"$0"

[root@testdayl]#sh00.sh(路径)

OO.sh

[root@testdayl]#catOO.sh

dirname"$0"

basename"$0"

[root@testdayl]#sh/scripts/dayl/OO.sh(sh路径)

/scripts/dayl

OO.sh

[root@testdayl]#

$*:获取当前shell的所有参数,将所有的命令行参数视为单个字符串,相当于〃$1$2$3〃....

注意与$#区别。(表示所有位置参数的内容。)

$#:获取当前shell命令行中参数的总个数。

[root@testdayl]#catn.sh

echo$1$2$3${10}

echo$#

[root@testdayl]#shn.sh123

123

3(显示命令行总个数)

[root@testdayl]#shn.sh12345

123

5

[root@testdayl]#

[root@testdayl]#catbijiao.sh

if[$#-ne3];then(命令行输入3个)

echo"err,plsinput3argv."(否则显示错误)

exit1

else

echo"ok"

fi

[root@testdayl]#shbijiao.sh

err,plsinput3argv.

[root@testdayl]#shbijiao.shaa

err,plsinput3argv.

[root@testdayl]#shbijiao.shaabb

err,plsinput3argv.

[root@testdayl]#shbijiao.shaabbcc

ok

[root@testdayl]#shbijiao.shaabbccdd

err,plsinput3argv.

[root@testdayl]#

$@:这个程序的所有参数“$1”“$2”“$3”.…,这是将参数传递给其他程序的最佳方

式,因为他会保留所有内嵌在每个参数里的任何空白。

注意$*和$@的区别:

进程状态变量

$$:获取当前shell的进程号(PID)。

$!:执行上一个指令的PID,上一个后台运行进程的进程号。

$?:获取执行上一个指令的返回值(0为成功,非0为失败)

例子:

[root@testdayl]#oldboy

-bash:oldboy:commandnotfound

[root@testdayl]#echo$?

127(非0,上一条命令执行失败)

[root@testdayl]#pwd

/scripts/dayl

[root@testdayl]#echo$?

0

[root@testdayl]#

返回值:

0:表示运行成功。

2:权限拒绝。

1~125:表示运行失败,执行错误。

126:未找到执行的命令。

>128:命令被系统强制结束。

$_:在此之前执行的命令(上一个命令)或脚本的最后一个参数。

Shell脚本的概念

凡是使用shell编程语言脚本编写的程序文件都可以称为shell脚本。

只要将linux命令按顺序保存到一个文本文件中,并给予这个文件可执行权限,那么这个文

件就可以称为shell脚本。Shell脚本是属于解释执行的,并不需要进行特别编译,只需要有

相应的shell命令解释器即可。

查看系统脚本文件的数量和文件类型:

[root@localhost~]#Is-I/etc/rc.d/init.d/*|wc-I

67

[root@localhost~]#file/etc/rc.d/init.d/*|tail-2

/etc/rc.d/init.d/wpa_supplicant:Bourne-Againshellscripttextexecutable

/etc/rc.d/init.d/ypbind:POSIXshellscripttextexecutable

[root@localhost

Linux中的系统脚本文件属主都是管理员用户root,所有的脚本文件都具有可执行(x)属性,

因此可以由shell解释执行。Shell脚本文件以文本文件的形式保存,可以使用cat命令查看

文件内容,也可以使用vi编辑器修改文件的内容。

查看系统中的网络服务脚本network文件的开头五行内容:

[root@localhost"]#cat/etc/rc.d/init.d/network|head-5

#!/bin/bash

#

#networkBringup/downnetworking

#

#chkconfig:23451090

[root@localhost

Linux中的系统脚本文件只有管理员root才具有修改的权限。

编写一个完整可运行的Shell脚本需要经过以下步骤:

1.建立包含可执行语句的文本文件

使用vi创建脚本文件,可以有扩展名,也可以没有。

脚本中包括的内容如下:

运行环境设置:通常位于文件的第一行,用于指定使用哪一个shell程序解释。

设置以“#!”开始,后面紧跟指定的完整路径,例如#!/bin/bash。

注释行:以#符号开头的内容都被视为注释行。

可执行语句:是脚本最重要的组成部分。在命令行中可执行的命令都可以写入脚本中,

当程序运行时,默认将会按照顺序依次解释执行。还可以添加一些程序结构语句。

以上部分只有可执行语句是必不可少的。

例子:

使用vi编辑一个用于查看当前系统中/boot目录所占空间的大小,并列出内核文件的属性信

息的脚本文件repboot.sho

[root@localhostvirepboot.sh

[root@localhostcatrepboot.sh

#!/bin/bash(指定shell路径)

#/bootandkernel(注释)

echo"Useageof/boot:"(显示提示信息)

du-sh/boot(查看目录空间)

echo"themodeofkernelfile:"(显示提示信息)

Is-Ih/boot/vmlinuz-*(查看文件属性)

[root@localhost

2.为脚本添加可执行权限

编好脚本后,需要执行程序才能看到结果。但是新创建的脚本不具有可执行属性,需要

用命令chmod为文件添加x权限:

[root@localhost~]#Is-Irepboot.sh(查看)

-rw-r-r-.1rootroot1234月2510:50repboot.sh(无x权限)

[root@localhost

[root@localhostchmoda+xrepboot.sh(力口x权限)

[root@localhost~]#Is-Irepboot.sh(查看)

-rwxr-xr-x.1rootroot1234月2510:50repboot.sh(有啦x权限)

[root@localhost

执行shell脚本:有多种方式执行shell脚本:

1.直接执行带x权限的脚本文件

最常用的一种方式。直接通过脚本文件路径执行

[root@localhost~]#./repboot.sh(・/执行)

Useageof/boot:

27M/boot

themodeofkernelfile:

-rwxr-xr-x.1rootroot3.9M2月222013/boot/vmlinuz-2.6.32-358.el6.x86_64

[root@localhost~]#

2.使用shell解释器程序执行脚本

由解释器程序负责读取脚本文件中的内容并执行,不需要x权限,通常在脚本调试中使

用。(bash或sh执行,两个意思一样。)

[root@localhost~]#bashrepboot.sh(bash执行)

Useageof/boot:

27M/boot

themodeofkernelfile:

-rwxr-xr-x.1rootroot3.9M2月222013/boot/vmlinuz-2.6.32-358.el6.x86_64

[root@localhost

3.使用.命令执行

上面都是在当前shell中启动一个子shell来运行脚本程序。需要在当前shell环境中运行

用bash的内部命令.或source命令。也是不需要x权限。

[root@localhost~]#.repboot.sh(,后有空格)

Useageof/boot:

27M/boot

themodeofkernelfile:

-rwxr-xr-x.1rootroot3.9M2月222013/boot/vmlinuz-2.6.32-358.el6.x86_64

[root@localhost~]#

注意执行脚本方式第三种和前两种的区别!

其他说明:

shell脚本的建立:

shell脚本通常是在编辑器如vi中编写,由unix/linux,bashshell命令,程序结构控制语句和

注释等内容组成。

脚本开头(第一行):#!/bin/bash必须在第一行。

一个规范的shell脚本的第一行会指出由哪个程序来执行脚本,一般为:

#!/bin/bash或#!/bin/sh

在执行脚本的时候,内核会根据它来确定该用哪个程序来解释脚本中的内容,这一行必须在

脚本顶端的第一行,如果不是第一行则为注释。

linux中常用脚本语言开头的写法,在不同的语言开头一般都要加一行相应的标识语言:

#!/bin/sed

#!/usr/bin/awk

#!/usr/bin/perl

默认为bash的系统,用bash可以不用在第一行加!为了养成好习惯,最好第一行加上!

脚本注释:

跟在#后面的内容。

shell脚本的执行:

当shell脚本文件以非交互方式运行时,它会先查找环境变量ENV,该变量指定了一个环境

文件,通常是.bashrc,然后从该环境变量文件开始执行,当读取了ENV文件后,SHELL才开

始执行shell脚本。

执行shell脚本三种方法:

1.bash脚本名称或sh脚本名称

当脚本文件本身没有可执行权限(X权限)使常用的方法。

2.path/脚本名称或./脚本名称

需要先将脚本权限改为可执行权限(X权限),然后通过脚本路径执行。

3.source脚本名称或.脚本名称

使用这种方法读入或加载指定的shell脚本(如san.sh),然后依次执行指定shell脚本文

件san.sh中的所有语句。这些语句将作为当前父shell脚本father.sh进程的一部分运行。

就是说在当前shell中执行脚本文件,而不是产生一个子shell来执行文件中的命令。

使用前两种执行脚本,是在当前shell中启动一个子shell来运行脚本程序,因此脚本程

序定义的环境变量只能在子shell环境中使用,无法再当前的shell中使用.

source命令与shellscripts的区别是,source在当前bash环境下执行命令,而scripts是

启动一个子shell来执行命令。这样如果把设置环境变量(或alias等等)的命令写进scripts

中,就只会影响子shell,无法改变当前的BASH,所以通过文件(命令列)设置环境变量时,

要用source命令。

source命令(从CShell而来)是bashshell的内置命令。点命令,就是个点符号,(从Bourne

Shell而来)是source的另一名称。同样的,当前脚本中配置的变量也将作为脚本的环境,

source(或点)命令通常用于重新执行刚修改的初始化文档,如

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论