Shell

无他唯程序尔 2011-11-22

shell是介于操作系统和使用者之间的接口。

对用户而言可以屏蔽系统的负责性。

对于系统而言可以防止用户的误操作或是有意的破坏。

使用较广的shell有标准的Bourneshell(sh)、KornShell(ksh)、Cshell(csh)、BourneAgainShell(bash)等。

查看当前环境所用shell:echo$SHELL

shell的另一个重要特性是它自身就是一个解释型的程序设计语言,shell程序设计语言支持绝大多数在高级语言中能见到的程序元素,如函数、变量、数组和程序控制结构。shell编程语言简单易学,任何在提示符中能键入的命令都能放到一个可执行的shell程序中。

本质上,shell脚本是命令行命令简单的组合到一个文件里面。Shell基本上是一个命令解释器,类似于DOS下的command.com。它接收用户命令,然后调用相应的应用程序。

进入shell脚本编程:

1.在一个目录下创建一个hello.sh文件

touchhello.sh

2.使用vi编辑器打开hello.sh

vihello.sh

3.按i键进入编辑模式

敲入:

#!/bin/sh/*shell脚本固定第一行,告诉系统这个是shell文件*/

#hello.sh/*shell的文件名称*/

#Toshowhellotosomebody/*功能部分*/

echo-n“EnterYourName:”

readNAME

echo“Hello,$NAM!”

4.保存推出vi

按esc键,按shift+冒号键,wq

5.给刚刚创建shell文件授权

chmodu+xhello.sh

6.执行脚本

./hello.sh

查看用户身份

whoami

切换用户

su用户名

文件查找使用find

如:

文件内容查找使用grep

如:grep"aa"hello.sh

文件访问权限

一个文件已经创建就有3种访问形式

r表示文件刻度对应的八进制表示为4w表示文件可写可以删除对应的八进制是2x表示如果是程序的话表示可以执行对应的八进制是1

文件的类型

前缀类型前缀类型

—普通文件l链接(link)文件

b块(block)设备文件p命名管道(pipe)文件

c字符(character)设备文件s本地套接口(socket)

d目录(directory)

一个文件由1个类型和9个权限位来描述,9个权限位分为3组,每组3个权限位,具体表示如下所示:

-(类型)

rwx(u:user文件的属主)

rw-(g:group属主所在的组,属组)

r-x(o:other其他用户)

a(以上三种人)

改变文件或是目录的权限

chmod[u/g/o/a][+/-/=][权限]文件或是目录名

+表示添加权限

-表示去掉指定权限

=表示清除之前的权限并赋予新设定的权限

chmod允许8进制符合作为模式,改变权限

chmodpermissionCodefileName/dicName

-rwxrw-r-x

该文件所具有的权限为

7(rwx)6(rw)5(rx)即765

r用4表示

w用2表示

x用1表

chmod实例

假设hello.c最初拥有rwxrwxrwx的权限

依次执行一下的命令:

命令结果含义

chmoda-xhello.crw-rw-rw收回所有用户的执行权限

chmodgo-whello.crw-r--r--收回同组用户和其他用户的写权限

chmodg+whello.crw-rw-r--赋予同组写的权限

chmoda=hello.c---------清除所有权限

chmod666hello.crw-rw-rw-赋予所有用户和写的权限

chmod644hello.crw-r--r--赋予属主读、写权限,其他用户和属组读的权限

chmod700hello.crwx------赋予属主读、写、执行的权限

chmod660hello.crw-rw----赋予属主读写权限,同组用户读写权限

改变文件目录的属主

改变文件目录的属主

chownOwnerfileName/dicName

如:chowndevhello.c

改变文件或目录的属组

chownGroupfileName/dicName

如:chowndevGrouphello.c

改变文件或是目录的属主和属组

chownowner:groupfileName/dicName

如:chwoncloud:cloudhello.c

变量

保存暂时信息

变量一般都用大写字母表示

使用echo可以显示单个变量的取值,要在变量前加$

如:

USER="haison"

echo$USER

如果设置变量时,不想改变其值,可以将变量设置为只读,只要在变量前加上readonly

使用set命令可以显示本地所有定义的shell变量

unset变量名:清除变量的定义

变量的分类:本地变量(用户自定义的变量)、环境变量(用于所有用户定义的变量,用于用户进程前必须使用export导出)、位置变量:$0(脚本名),$1-$9:脚本参数、

特定变量:脚本运行时的一些相关信息。

$#传递到脚本的参数个数

$*传递到脚本的参数,与位置变量不同,此选项参数可超过9个

$$脚本运行时当前进程的ID号,常用作临时变量的后缀,如haison.$$

$!后台运行的(&)最后一个进程的ID号

$@与$#相同,使用时加引号,并在引号中返回参数个数

$-上一个命令的最后一个参数

$?最后命令的退出状态,0表示没有错误,其他任何值表明有错误

示例:

#!/bin/sh

#VarTest.sh

#Totestthevariables

USER=haison

echo"Hello,$USER,theoutputofthisscriptareasfollows:"

echo"Thescriptnameis:`basename$0`"

echo"Thefirstparamofthescriptis:$1"

echo"Thesecondparamofthescriptis:$2"

echo"Thetenthparamofthescriptis:$10"

echo"Alltheparamsyouinputare:$*"

echo"Thenumberoftheparamsyouinputare:$#"

echo"TheprocessIDforthisscriptis:$$"

echo"Theexitstatusofthisscriptis:$?"

文件状态测试

-d目录-r可读

-f常规文件-w可写

-L符号连接-x可执行

-s文件长度大于0,非空-u文件有suid位设置

示例:[-shaison.c]0表示成功,其他为失败,下同。

逻辑操作符

-a逻辑与(and),操作符两边均为真,结果为真,否则为假。

-o逻辑或(or),操作符两边一边为真,结果为真,否则为假。

!逻辑否,条件为假,结果为真,反之。

示例:[-rhaison.c–a–whai.c

字符串测试

=两个字符串相等-z空串

!=两个字符串不相等-n非空串

示例:[-z$SHELL]

数值测试

-eq数值相等(equalto)-lt第一个数小于第二个数(lessthan)

-ne数值不相等(notequalto)-le第一个数小于等于第二个数

-gt第一个数大于第二个数(greaterthan)-ge第一个数大于等于第二个数

示例:[“10”-eq“12”]

控制结构

选择结构:

if语句:ifthenelse提供条件测试

case语句:允许匹配模式、单词或值

循环结构:

for:每次依次处理列表内的信息,直至循环耗尽。

until:不常用。条件在循环末尾,至少执行一次。

while:条件在循环头部。

示例

#!/bin/sh

#ifTest

#toshowthemethodofif

echo-e"Enterthefirstinteger:\c"

readFIRST

echo-n"Enterthesecondinteger:"

readSECOND

if["$FIRST"-gt"$SECOND"]

then

echo"$FIRSTisgreaterthan$SECOND"

elif["$FIRST"-gt"$SECOND"]

then

echo"$FIRSTislessthan$SECOND"

else

echo"$FIRSTisequalto$SECOND"

fi

示例

#!/bin/sh

#caseTest

#totestthemethodofcase

USER=`whoami`

case$USERin

root)echo“Youcandoalltheoperations”

;;

Dave)echo"Youcandosomeoperations”

;;

*)echo"Sorry,youcannotdoanything"

;;

esac

#!/bin/sh

#forTest

#totestthemethodoffor

COUNTER=0

forFILESin*

do

COUNTER=`expr$COUNTER+1`

done

echo"Thereare$COUNTERfilesin`pwd`"

示例

#!/bin/sh

#untilTest

#totestthemothodofuntil

IS_ROOT=`who|greproot`

until["IS_ROOT"]

do

IS_ROOT=`who|greproot`

sleep5

done

echo"Watchit.rootin!"

示例

#!/bin/sh

#whileTest

#totestthemethodofwhile

COUNTER=0

while[$COUNTER-lt10]

do

echo$COUNTER

COUNTER=`expr$COUNTER+1`

done

whilereadLINE

do

echo$LINE

done<names.txt

函数

格式

函数名()

{

命令

}

所有函数在使用前必须定义,这意味着必

须将函数放在脚本开始部分,直至shell解释

器首次发现它,才可以使用。

调用函数仅使用其函数名即可,要传给函

数的变量跟在函数后面。

函数里面定义的变量以下划线(_)开始。

函数可以放在同一个文件中作为一段代

码,也可以放在只包含函数的单独文件中,文

件也必须以#!/bin/sh开头。

#!/bin/sh

#funTest

#totestthefunction

DATE=`date`

Hello()

{

echo“Hello,todayis$DATE”

}

Hello

#!/bin/sh

#funTest

#totestthefunction

../Hello

Hello

注释和管道线

shell脚本中以“#”开头的正文行表示注释.

#!/bin/bash

#Thisscriptisatest!这些均是注视,第一行必须有

管道线由|表示,前一个命令的输出正是后一个命令的输入

例如:

[root@localhostpro]$ls-l|wc-l

命令与&&表示第一个命令执行成功第二个命令才会执行

命令||

内部变量

$#——传送给shell程序的位置参数的数量

$?——最后命令的完成码或者在shell程序内部执行的shell程序(返回值)

$0——shell程序的名称

$*——调用shell程序时所传送的全部参数成的单字符串环境变量

(1)HOME:用户目录的全路径名。//对应/home/cloud下,每个人可以分别设置

(2)LOGNAME:即用户的注册名,由Linux自动设置。

(3)MAIL:用户的系统信箱的路径。

(4)PATH:shell从中查找命令的目录列表

正则表达式

(2)?(问号),它匹配任意一个字符。

(3)[](一对方括号),其中有一个字符组。其作用是匹配该字符组所限定的任何一个字符。

(4)!(惊叹号),如果它紧跟在一对方括号的左方括号[之后,则表示不在一对方括号中所列出的字符。

(5)^(幂次方号),只允放在一行的开始匹配字符串。

(6)$(美元号),只在行尾匹配字符串,它放在匹配单词的后面。

*0次或是多次

+1次或是多次

?0次会1次

字符串比较

s1=s2:如果s1等于s2,则测试条件为真;

s1!=s2:如果s1不等于s2,则测试条件为真;

-ns1:如果字符串s1长度大于0,则测试条件为真;

-zs1:如果字符串s1长度等于0,则测试条件为真

数字比较

n1–eqn2:如果n1等于n2,则测试条件为真;

n1–nen2:如果n1不等于n2,则测试条件为真;

n1–gtn2:如果n1大于n2,则测试条件为真;

n1–gen2:如果n1大于或等于n2,则测试条件为真;

n1–ltn2:如果n1小于n2,则测试条件为真;

n1–len2:如果n1小于或者等于n2,则测试条件为真。

文件条件测试

(3)文件操作符

-r文件名:如果文件存在且是用户可读的,则测试条件为真;

-w文件名:如果文件存在且是用户可写的,则测试条件为真;

-x文件名:如果文件存在且是用户可执行的,则测试条件为真;

-d文件名:如果文件存在且是目录文件,则测试条件为真;

-f文件名:如果文件存在且是普通文件,则测试条件为真;

-b文件名:如果文件存在且是块文件,则测试条件为真;

-c文件名:如果文件存在且是字符文件,则测试条件为真;

-s文件名:如果文件存在且长度大于0,则测试条件为真;

使用yum搜索文件

yumsearchg++

使用yum按照软件

yuminstallg++

编译

进入应用目录后make

按照编译后的文件

makeinstall

为sh文件传入参数的方法

例:test.sh

#!/bin/sh

echo$1

执行

shtest.shaaa

相关推荐