shell脚本等的操作
1、命令替换:``
反向单引号,也称重音符。键盘上和~键在一起的那个键呦,千万不要敲成单引号。
A、
使用了``后,shell首先替换输出中``括起来的date命令,然后执行整个输出命令。
B、命令替换还可以用于在变量中存储命令输出,如下:
变量ctr将包含当前目录中名字以.txt结尾的文件的计数。
2、expr
大部分shell不支持数字变量,所有变量会被作为字符串。如var=25,变量var中包含的是字符2和字符5组成的字符串,而不是数字25.
Expr命令用来评估算术表达式,命令的输出发送到标准输出。
如上图所示,expr 4 + 5进行整数的加法运算,输出9.
。
expr命令支持的算术运算符有:+ 、-、 *、 /、 %。但是*需要使用\进行转义,否则shell会将*作为通配符处理,如下图所示:
注意:使用expr命令是,算术运算符的左右两边必须添加一个空格。如下图所示,不添加空格时,不会进行算术运算:
此外,expr命令只支持整数运算,不支持小数,如下所示,使用小数无法获取正确算术运算结果:
expr命令的输出将发送到标准输出,若想输出存储到变量中,可以结合命令替换使用:
3、typeset-i
Bash和ksh shell对整数变量提供有限的支持。我们可以使用typeset –i 变量名定义一个整数变量,可以直接使用该整数变量进行算术运算。
4、评估表达式,返回”真”或”假” test/[](方括号)
通常会使用test或[]用来评估条件是否成立。语法如下:
test 表达式
[ 表达式 ]
注意test之后先加空格,再写表达式。使用[]时,表达式的左右两边都需要添加空格。表达式的比较运算符左右两边都需要添加一个空格。
表达式里包含多个条件时,可以使用选项-a和-o:
-a:条件同时成立,与,and的意思,
-o:一个条件成立即可,或者,or的意思
test/[]主要用在编程构造中,所以我们在下面的编程构造部分,具体展示其用法。
5、if构造
if构造作用和java中的if语句一样,语法有所区别
if构造语法:
if condition(s)
then command(s)
[ else command(s) ]
fi
if构造必须以fi结尾,else部分不是必须的,具体看使用场景。
if…elif构造
if condition(s)
then command(s)
elif command(s)
else command(s)
fi
if构造可以有多个elif语句,但只能有一个fi来结束构造,else最多也只能有一个。
课堂练习:
在shell脚本中,脚本文件名字叫testif.sh,实现以下功能:
1、提示用户输入成绩
2、读取用户输入的成绩放到变量mark中
3、如果mark>= 80,提示用户“you are excellent!”
mark>= 70 && mark <80, 提示“hei,guy,you are good.”
mark >= 60 && mark < 70, 提示“it is ok.”
mark <60 , 提示 “oh, guy ,it is so bad,you should work hard.”
算术测试中的比较运算符使用以下选项表示
等于 -eq
不等于 -ne
大于等于 -ge
大于 -gt
小于等于 -le
小于 -lt
以下为shell脚本文件中语句:
代码执行效果:
其中判断条件书写时,除了使用test,也可以使用[],如:
6、case构造
case … esac构造语法为:
case $variable-name in
value1) command(s) ;;
value2) command(s) ;;
.
.
.
*) command(s) ;;
Esac
该构造用于在shell脚本中根据变量值执行特定的指令集,评估变量的值,并将其与指定的每个值比较。当变量值与指定值之一匹配时,将执行在该值下指定的命令集。
课堂练习:
1、编写一个shell脚本,文件名字为testcase.sh
2、第一行提示用户输入数字年级:
在提示信息的同一行读取用户输入的年级,放到变量grade里
3、如果用户输入的是1,就显示freshman
如果用户输入的是2,就显示sophomore
如果用户输入的是3,就显示junior
如果用户输入的是4,就显示senior
如果用户输入的是其他的内容,显示ni cai
要求本功能使用case实现。
以下为shell脚本文件中语句:
使用case构造时,为任何变量值执行的最后一个命令后必须加一对分号,用于分隔为下一个值执行的命令集中的命令。
7、while构造
while循环的语法:
while condition(s)
do
command(s)
done
这里,只要条件为真,就执行do和done中间的命令。
break和continue语句
break和continue命令可以用于while循环。break表示退出整个循环,continue表示退出当前循环,开始下一次循环。
执行效果如下图所示:
课堂练习:
1、编写一个shell脚本,文件名字为testwhile.sh
2、使用while循环打印出1——10之间的数字
以下为shell脚本文件中语句:
或者:
执行效果:
8、until构造
until用法和while一样,但是是条件不成立时,即条件为假时,才进入循环,条件为真时,结束循环。
9、for构造
for循环语法:
for variable_name in <list_of_values>
do
…
…
Done
for循环将一列值作为输入,并为循环中的每个值执行该循环,即执行do … done之间的命令。
for循环中的一列值由一个或多个空格分隔。1——9可以用{1..9}表示
课堂练习:
编写shell脚本文件,输出九九乘法表:
echo命令后面选项e的作用是让后面的字符’\t’显示成特殊字符,即tab键,而不是作为普通文本输出。
执行效果:
补充:seq
Seq语句用于产生从某个数据到另外一个数据之间的所有整数,即序列,并可以指定序列中相邻两个整数之间的差值即序列增长的步幅。当只指定序列的起始值和结束值时,步幅为1;当只指定一个数值时,默认该指定数值为结束值,序列默认从1开始,步幅为1;当指定需要指定步幅时,需要先指定起始值,再指定步幅,最后指定结束值。如下图所示:
将上面九九乘法表中的内层循环改成for循环,就可以在内层循环中使用seq语句的输出作为内层循环所需要进行循环的列值:
10、exit
exit基于测试命令的结果从shell脚本退出,即停止执行并返回$提示符。exit命令可以用在if构造的if或者else部分中。
上面脚本执行结果:
当用户输入y时,退出,不在执行echo “you want to quit.” 语句。
另外,exit命令还可以写成exit n,n为任意整数。其中整数0表示成功,其他非0值表示不同的失败原因。在上面九九乘法表中,就使用到了exit 0。
11、test命令复习
test命令除了和if或while等构造结合使用,检查变量的值之外,还有另外三种用法:
A、test命令选项测试文件状态
测试文件状态的各选项,这里不一一列举,见课本6.11页。
下面列举一个例子:
上面脚本执行效果:
B、test用于算术测试
test命令与if结合,可以测试变量的数值,各选项代表的算术测试运算符和用法已在上面if构造部分演示。
C、test命令可以测试字符串
字符串测试运算符见课本6.13页。
12、创建函数
函数是由同一名称引用的并用于执行特定任务的语句块。需要重复执行同一任务时,应该为该任务创建一个函数,通过指定函数名来调用函数。函数必须先定义再调用。
定义函数语法:
function <function_name>
{
<commands>
}
(1)在shell脚本文件中定义函数f1,并添加调用函数语句。函数可以在shell脚本文件中,函数定义之后,可以通过函数名字调用:
执行上面脚本文件后:
(2)在命令符提示后,定义函数f2,并调用函数
(3)将参数传递给函数。使用它们的位置来引用传递给函数的参数,即利用定义函数时使用位置参数。
在shell脚本文件中定义函数listdir、viewfile、cpfile
如果只在shell脚本文件中定义函数,没有调用函数语句,那么执行shell脚本文件时,只是创建了函数,不会调用。并且在当前shell即命令提示符之后,也不能直接调用这些函数。
执行source 脚本文件名字 语句后,就可以在当前shell中调用定义的函数了。如下所示:
关于位置参数,将在下面演示。
13、处理shell脚本中的参数
参数用于将自变量从命令行传递到shell脚本。参数可以是任何值,通常是文件名或字符串,它是在shell提示符后指定的一个命令名或文件名。在脚本中,作为一个自变量来引用参数。
Shell按照Liunx解释命令,输入命令并按回车后,shell会以以下方式将命令行中的每个词放入到特殊变量:
命令行中的第一个词,即命令名,会被放入称为$0的变量。
命令行中的第一个参数,即命令行中的第二个词,被放入变量$1中。
命令行中的第二个参数,即命令行中的第三个词,被放入变量$2中。
除$0之外,shell最多可以正确创建9个变量,9个之后存储的值将不再准确。$1到$9也称为命令行的位置参数。根据命令中指定的参数的数量,shell将值赋给这些变量中的一些或全部。
Shell还会为以下变量赋值:
$*:包含整串参数
$#:包含命令中指定参数的数量
下面简单演示如何设置位置参数:
执行效果如下:
使用位置参数,实现复制文件:
执行效果:
14、shift命令
Shell最多只创建9个位置参数,即$0--$9。从第10个开始参数存储的值将不再正确。
如下所示,测试用户输入参数超过9的场景:
执行脚本文件,输入多个参数,发现$10参数存储的值为$1参数追加0,$11参数存储的值为$1参数追加1,这和实际输入不相符:
实际中,可能会发生用户输入参数超过9个情况,shift命令可以允许用户输入可变数量的参数,包括超过9个场景,shift可以使用多次。
本例中shift命令效果讲解:
本例用来帮助用户复制或函数文件,如果脚本文件名字之后输入c表示用户想要复制文件,输入d表示用户想要删除文件。输入其它时,给用户提示参数只能是c或d.
执行效果如下:
15、.bash_file文件
.bash_file文件是特殊的 文件,用户一登录系统时即执行此脚本。该文件可选,存在用户的 home目录中,是隐藏文件,ls命令中,-a选项可以查看隐藏文件:
16、here文档
对命令或shell脚本的输入通常包含在一个单独的文件中,然后会作为参数提供给脚本。还能将输入数据包含在shell脚本自身中,然后数据被认为是在一个here文档中,即输入就在这里,而不是在其他地方的某个文件中。<<运算符实现此类构造。
<<运算符用法:
command << pattern
:
:
pattern
上面两个pattern中之间 的内容视为输入,所以pattern必须成对出现,如果缺少第二个,则会认为从第一个pattern至文件末尾的内容全部都是输入内容,不会认为是特殊命令。
pattern只是起一个标识作用,可以用任何字符串来表示。第二个pattern需要定格写。
Here文档的一种用法是显示菜单,与使用多条echo语句相比,here文档是构建菜单屏幕的有效方式。
我们使用here文档改写一下前面的带选择菜单的while循环:
执行效果:
17、调试shell脚本
使用set命令结合-x、-v选项调试shell脚本。
下面演示在sh <filename> 命令中调用-x 或-v选项:
sh-v <filename>:
执行脚本时,首先显示脚本中书写的每行语句,然后显示执行语句后的结果
sh-x <filename>:
与sh -v <filename>类似,也是将shell文件中书写的每行语句显示出来,但是-x选项会在每行语句前面加+,并且还会对每个语句和表达式进行变量值的替换,然后显示语句的执行结果。
shell脚本等的操作的更多相关文章
- 通过shell脚本进行数据库操作
#!/bin/bash HOSTNAME="192.168.111.84" #数据库信息 PORT=" USERNAME="root" PASSWOR ...
- shell脚本之文件操作
文件测试运算符 文件测试运算符用于检测 Unix 文件的各种属性. 下面最常用的是 -f 参数 来检查是否是文件 #!/bin/bash #start nginx php-fpm list1=&quo ...
- shell脚本批量调用git命令
有时候想对本地的几个repository都进行一下pull,一个一个操作比较繁琐,所以写了个shell脚本进行简化操作. git_pull_all.sh #!/bin/sh clear functio ...
- 什么是 Shell 脚本?
Shell 既是一种命令语言,又是一种程序设计语言.Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务.Windows Explorer 是一个典型的图形 ...
- Android随笔之——用shell脚本模拟用户按键、触摸操作
之前写过两篇关于Android中模拟用户操作的博客(其实用一篇是转载的),现在就来讲讲用shell脚本来模拟用户按键操作.本次的目标是用shell脚本打开微信并在其搜索框中搜索相关内容. 本文的模拟功 ...
- 在 shell 脚本获取 ip、数字转换等网络操作
在 shell 脚本获取 ip.数字转换等网络操作 ip 和数字的相互转换 ip转换为数字 :: function ip2num() { local ip=$1 local a=$(echo $ip ...
- shell脚本操作mysql数据库
shell脚本操作mysql数据库,使用mysql的-e参数可以执行各种sql的(创建,删除,增,删,改.查)等各种操作 mysql -hhostname -Pport -uusername -pp ...
- Shell脚本中执行sql语句操作mysql
对于自动化运维,诸如备份恢复之类的,DBA经常需要将SQL语句封装到shell脚本.本文描述了在Linux环境下mysql数据库中,shell脚本下调用sql语句的几种方法,供大家参考.对于脚本输出的 ...
- shell脚本操作mysql库
shell脚本操作mysql数据库-e参数执行各种sql(指定到处编码--default-character-set=utf8 -s,去掉第一行的字段名称信息-N) 2011-05-11 18:18: ...
随机推荐
- addEvent和removeEvent优化写法
;(function(){ /** * 初始化分支是一种优化模式,当知道某个条件在整个生命周期内都不会发生变化时,仅对该条件测试一次. */ // 一般写法 var util = { addEvent ...
- sys.stdin的三种方式
1. for line in sys.stdin: import sys sys.stdout.write('根据两点坐标计算直线斜率k,截距b:\n') for line in sys.stdin: ...
- 一个Eclipse代码显示主题
- Navicat创建和设计MySQL事件
1.开启定时器 0:off 1:on SET GLOBAL event_scheduler = 1; 2.在navicat左侧选择一个数据库,单击“时间”-“创建事件”,弹出一个窗口.
- Python解析器源码加密系列之(一):标准c的tmpfile()、tmpfile_s()生成的临时文件究竟放在哪里了?
这两天由于修改python解释器的需求,需要用到tmpfile()来生成临时文件的FILE*,但是又担心这个临时文件是否存在于磁盘的某个地方,终究会被人找到,所以就简单做了以下几点实验,看看是否可以找 ...
- Opencv step by step - 绘图
有时候我们需要在图像上写一些字或者画一些简单的几何图案. 祭上代码: #include <cv.h> #include <highgui.h> int main(int arg ...
- Flex的正则表达式匹配速度与手工代码的比较
flex是一个词法分析器生成器,它是编译器和解释器编程人员的常用工具之一.flex的程序主要由一系列带有指令(称为动作代码)的正则表达式组成.在匹配输入时,flex会将所有的正则表达式翻译成确定性有穷 ...
- zoeDylan.js框架-数据底层
zoeDylan.js是墨芈自己写的一套前端框架,不过由于墨芈经验不足,所以框架内部代码有些混乱. 墨芈写这套框架的目的是为了存储以后做前端开发过程中的一些代码,简单的说这套框架就是一个大杂烩. 这套 ...
- web安全——简介
简介 不对外提供服务是最安全的. 安全是基于信任.如果信任失败了,则没有安全.比如你给一个ip加白名单,结果这个ip对你发动了安全攻击. 在非常明确需要提供服务的时候才对外提供服务,即白名单.其他的全 ...
- windows 7 + vs2010 sp1编译 x64位版qt4
由于qt官方没有发布预编译的64位版qt4,要使用64位版qt4,只能自己编译,编译过程如下: 1,下载源码并解压到D:\qt-src\qt-everywhere-opensource-src-4.8 ...