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脚本等的操作的更多相关文章

  1. 通过shell脚本进行数据库操作

    #!/bin/bash HOSTNAME="192.168.111.84" #数据库信息 PORT=" USERNAME="root" PASSWOR ...

  2. shell脚本之文件操作

    文件测试运算符 文件测试运算符用于检测 Unix 文件的各种属性. 下面最常用的是 -f 参数 来检查是否是文件 #!/bin/bash #start nginx php-fpm list1=&quo ...

  3. shell脚本批量调用git命令

    有时候想对本地的几个repository都进行一下pull,一个一个操作比较繁琐,所以写了个shell脚本进行简化操作. git_pull_all.sh #!/bin/sh clear functio ...

  4. 什么是 Shell 脚本?

    Shell 既是一种命令语言,又是一种程序设计语言.Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务.Windows Explorer 是一个典型的图形 ...

  5. Android随笔之——用shell脚本模拟用户按键、触摸操作

    之前写过两篇关于Android中模拟用户操作的博客(其实用一篇是转载的),现在就来讲讲用shell脚本来模拟用户按键操作.本次的目标是用shell脚本打开微信并在其搜索框中搜索相关内容. 本文的模拟功 ...

  6. 在 shell 脚本获取 ip、数字转换等网络操作

    在 shell 脚本获取 ip.数字转换等网络操作 ip 和数字的相互转换 ip转换为数字 :: function ip2num() { local ip=$1 local a=$(echo $ip ...

  7. shell脚本操作mysql数据库

    shell脚本操作mysql数据库,使用mysql的-e参数可以执行各种sql的(创建,删除,增,删,改.查)等各种操作 mysql  -hhostname -Pport -uusername -pp ...

  8. Shell脚本中执行sql语句操作mysql

    对于自动化运维,诸如备份恢复之类的,DBA经常需要将SQL语句封装到shell脚本.本文描述了在Linux环境下mysql数据库中,shell脚本下调用sql语句的几种方法,供大家参考.对于脚本输出的 ...

  9. shell脚本操作mysql库

    shell脚本操作mysql数据库-e参数执行各种sql(指定到处编码--default-character-set=utf8 -s,去掉第一行的字段名称信息-N) 2011-05-11 18:18: ...

随机推荐

  1. 测试驱动开发实践 - Test-Driven Development(转)

    一.前言 不知道大家有没听过“测试先行的开发”这一说法,作为一种开发实践,在过去进行开发时,一般是先开发用户界面或者是类,然后再在此基础上编写测试. 但在TDD中,首先是进行测试用例的编写,然后再进行 ...

  2. File的保存与读取

    import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io ...

  3. Eclipse系列: Eclipse设置Tomcat启动超时时间

    在eclipse的workspace目录下,找到如下文件: .metadata\.plugins\org.eclipse.wst.server.core\servers.xml 如下图所示,然后将它修 ...

  4. [CareerCup] 4.4 Create List at Each Depth of Binary Tree 二叉树的各层创建链表

    4.4 Given a binary tree, design an algorithm which creates a linked list of all the nodes at each de ...

  5. nodeJs--模块module.exports与实例化方法;

    在nodejs中,提供了exports 和 require 两个对象,其中 exports 是模块公开的接口,require 用于从外部获取一个模块的接口,即所获取模块的 exports 对象.而在e ...

  6. CodeIgniter框架入门教程——第一课 Hello World!

    本文转载自:http://www.softeng.cn/?p=45 今天开始,我将在这里连载由我自己编写的<CodeIgniter框架入门教程>,首先,这篇教程的读着应该是有PHP基础的编 ...

  7. php 验证格式的函数总结

    在首页上看到了这篇总结性的文章,就收藏了起来,想转载过来留着以后方便查看,但是没有找到转载的地,就只有copy下来了.在这里谢谢群主的分享! // ※CheckMoney($C_Money) 检查数据 ...

  8. python3 入门 (二) 列表的使用

    列表用于组织其它数值,即写在方括号之间.用逗号分隔开的数值列表.列表内的项目不必全是相同的类型. 列表的定义 student = ['Tom', 'Jack', 'Avril'] 添加元素 将另一个列 ...

  9. xsd、wsdl生成C#类的命令行工具使用方法

    1.xsd生成C#类命令 示例:xsd <xsd文件路径> /c /o:<生成CS文件目录> <其他参数> 参数说明: /c 生成为cs文件,/d 生成DataSe ...

  10. http状态码介绍

    基本涵盖了所有问题HTTP 400 – 请求无效HTTP 401.1 – 未授权:登录失败HTTP 401.2 – 未授权:服务器配置问题导致登录失败HTTP 401.3 – ACL 禁止访问资源HT ...