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选项会在每行语句前面加+,并且还会对每个语句和表达式进行变量值的替换,然后显示语句的执行结果。

时间: 2024-10-11 05:12:14

shell脚本等的操作的相关文章

python ,shell 脚本 执行同样操作,花费时间效率对比

废话不说,直接上图(第一个是python写的脚本,第二个和第三个是shell): 文件是一份nginx的log文件,总共583万行,然后是统计各个ip出现次数,各个脚本的执行时间如上所示. 测试环境是:centos 6.5,四核cpu,8g内存. 下面是python脚本 结果是:单核情况下,awk 自增运算最快,python脚本次之,awk和sort等命令的组合最次,猜测awk 是c/c++写的,python解释执行,awk | sort |uniq 的组合,估计哪衔接不好,效率最差. pyth

shell脚本后台运行操作

最近帮同学写一个简单脚本= =(别喷我~~),状况频出,后台运行方式和ctrl+Z概念没有理解清楚搞出了大笑话,一下晾出脚本和解决过程: #!/bin/bash     while :;do           a=`date +%Y/%m%d%T`           java=`ps aux |grep vsftpd |awk 'NR==1{print $3}'`           echo "时间$a,CPU使用率$java" >> xiangchen/1.txt

shell脚本进行数据库操作

mysql  mysql -h${HOSTNAME} -P${PORT} -u${USERNAME} -p${PASSWORD} -e "sql语句"    -hlocalhost -uroot -proot customer -e "select * from customer" > 1.txt 参考文章: http://www.2cto.com/database/201410/343557.html shell编程-- EOF http://blog.16

shell 脚本中测试操作符号及 &amp;&amp; 与 ||

测试操作符 常用测试操作符 英文名 说明 -f 文件 file 文件存在且为普通文件为真,即测试表达式成立 -d 文件 directory 文件存在且为目录文件为真,即测试表达式成立 -s 文件 size 文件存在且文件大小不为 0 为真,即测试表达式成立 -e 文件 exist 文件存在为真,即测试表达式成立 -r 文件 read 文件存在且可读为真,即测试表达式成立 -w 文件 write 文件存在且可写为真,即测试表达式成立 -x 文件 executable 文件存在且可执行为真,即测试表

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

1 #!/bin/bash 2 3 HOSTNAME="192.168.111.84" #数据库信息 4 5 PORT="3306" 6 7 USERNAME="root" 8 9 PASSWORD="" 10 11 12 DBNAME="test_db_test" #数据库名称 13 14 TABLENAME="test_table_test" #数据库中表的名称 15 16 17 #

Java之美[从菜鸟到高手演练]之Linux下shell脚本的使用(一)

作者:二青 个人站点:zhangerqing.cn    邮箱:[email protected]    微博:http://weibo.com/xtfggef Shell脚本就是将很多条命令结合起来写在一起,通过运算以及判断来实现很多功能的文本.为什么学习shell,首先一些常规的系统管理操作,并且需要自动化地执行,如果用shell脚本把这些操作集中在一起,只需要定期的执行这个shell脚本就可以了,其次,对于一些复杂的文本处理,比如日志分析等等,可能需求比较多,单条执行命令不是很方便,因此也

使用shell脚本简单模拟对特定文件同时读写操作

使用shell脚本简单模拟对特定文件同时读写操作文件内容的格式:field1    ,       field2    , field3    ,       field4以,为分隔符,但是存在空格. 脚本用法如下: ./check_write_read.sh 10 输出结果: Thu Apr 27 19:59:44 CST 2017:Read operation finished 670 Thu Apr 27 19:59:44 CST 2017:Write operation finished

Shell脚本中执行sql语句操作

这篇文章主要介绍了Shell脚本中执行sql语句操作mysql的5种方法,本文讲解了将SQL语句直接嵌入到shell脚本文件中.命令行调用单独的SQL文件.使用管道符调用SQL文件等方法,需要的朋友可以参考下 对于自动化运维,诸如备份恢复之类的,DBA经常需要将SQL语句封装到shell脚本.本文描述了在Linux环境下mysql数据库中,shell脚本下调用sql语句的几种方法,供大家参考.对于脚本输出的结果美化,需要进一步完善和调整.以下为具体的示例及其方法. 1.将SQL语句直接嵌入到sh

Linux Shell脚本与Vim常用操作笔记

本篇笔记记录最最基本的vim和shell操作. ShellScript能干什么 Shellscript类似与Windows的批处理,可以把很多指令汇总到一起,于是可以很容易地通过一个操作执行多个命令.很轻量,有效率. 在Vim中编写 Vim/Vi编辑器很强大,功能非常多,快捷键.指令更多,只需要知道最常用的就够了. Vi有3种工作模式 1.命令模式 进去之后的默认模式就是命令模式.能接受命令,但是不明文显示. 2.输入模式 命令模式按下a键就进入输入模式(还能按i.o.s等等).按Esc返回命令