Shell
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