linux shell 编程入门 shell在线编程

今天给各位分享linux shell 编程入门的知识,其中也会对shell在线编程进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

如何使用Linux shell编程来进行系统管理和网络管理

从程序员的角度来看, Shell本身是一种用C语言编写的程序,从用户的角度来看,Shell是用户与Linux操作系统沟通的桥梁。用户既可以输入命令执行,又可以利用 Shell脚本编程,完成更加复杂的操作。在Linux GUI日益完善的今天,在系统管理等领域,Shell编程仍然起着不可忽视的作用。深入地了解和熟练地掌握Shell编程,是每一个Linux用户的必修功课之一。

Linux的Shell种类众多,常见的有:Bourne Shell(/usr/bin/sh或/bin/sh)、Bourne Again Shell(/bin/bash)、C Shell(/usr/bin/csh)、K Shell(/usr/bin/ksh)、Shell for Root(/sbin/sh),等等。不同的Shell语言的语法有所不同,所以不能交换使用。每种Shell都有其特色之处,基本上,掌握其中任何一种就足够了。在本文中,我们关注的重点是Bash,也就是Bourne Again Shell,由于易用和免费,Bash在日常工作中被广泛使用;同时,Bash也是大多数Linux系统默认的Shell。在一般情况下,人们并不区分 Bourne Shell和Bourne Again Shell,所以,在下面的文字中,我们可以看到#!/bin/sh,它同样也可以改为#!/bin/bash。

利用vi等文本编辑器编写Shell脚本的格式是固定的,如下:

#!/bin/sh

#comments

Your commands go here

首行中的符号#!告诉系统其后路径所指定的程序即是解释此脚本文件的Shell程序。如果首行没有这句话,在执行脚本文件的时候,将会出现错误。后续的部分就是主程序,Shell脚本像高级语言一样,也有变量赋值,也有控制语句。除第一行外,以#开头的行就是注释行,直到此行的结束。如果一行未完成,可以在行尾加上",这个符号表明下一行与此行会合并为同一行。

编辑完毕,将脚本存盘为filename.sh,文件名后缀sh表明这是一个Bash脚本文件。执行脚本的时候,要先将脚本文件的属性改为可执行的:

chmod+x filename.sh

执行脚本的方法是:

./filename.sh

下面我们从经典的“hello world”入手,看一看最简单的Shell脚本的模样。

#!/bin/sh

#print hello world in the console window

a="hello world"

echo$a

Shell Script是一种弱类型语言,使用变量的时候无需首先声明其类型。新的变量会在本地数据区分配内存进行存储,这个变量归当前的Shell所有,任何子进程都不能访问本地变量。这些变量与环境变量不同,环境变量被存储在另一内存区,叫做用户环境区,这块内存中的变量可以被子进程访问。变量赋值的方式是:

variable_name= variable_value

如果对一个已经有值的变量赋值,新值将取代旧值。取值的时候要在变量名前加$,$variable_name可以在引号中使用,这一点和其他高级语言是明显不同的。如果出现混淆的情况,可以使用花括号来区分,例如:

echo"Hi,$as"

就不会输出“Hi, hello worlds”,而是输出“Hi,”。这是因为Shell把$as当成一个变量,而$as未被赋值,其值为空。正确的方法是:

echo"Hi,${a}s"

单引号中的变量不会进行变量替换操作。

关于变量,还需要知道几个与其相关的Linux命令。

env用于显示用户环境区中的变量及其取值;set用于显示本地数据区和用户环境区中的变量及其取值;unset用于删除指定变量当前的取值,该值将被指定为NULL;export命令用于将本地数据区中的变量转移到用户环境区。

下面我们来看一个更复杂的例子,结合这个例子,我们来讲述Shell Script的语法。

1#!/bin/bash

2# we have less than 3 arguments. Print the help text:

3 if [$#-lt 3 ]; then

4 cat<<HELP

5 ren-- renames a number of files using sed regular expressions

6

7 USAGE: ren'regexp''replacement' files

8 EXAMPLE: rename all*.HTM files in*.html:

9 ren'HTM$''html'*.HTM

10

11 HELP

12 exit 0

13 fi

14 OLD="$1"

15 NEW="$2"

16# The shift command removes one argument from the list of

17# command line arguments.

18 shift

19 shift

20#$* contains now all the files:

21 for file in$*; do

22 if [-f"$file" ]; then

23 newfile=`echo"$file"| sed"s/${OLD}/${NEW}/g"`

24 if [-f"$newfile" ]; then

25 echo"ERROR:$newfile exists already"

26 else

27 echo"renaming$file to$newfile"

28 mv"$file""$newfile"

29 fi

30 fi

31 done

我们从头来看,前面两行上一个例子中已经解释过了,从第三行开始,有新的内容。if语句和其他编程语言相似,都是流程控制语句。它的语法是:

if…; then

elif…; then

else

fi

与其他语言不同,Shell Script中if语句的条件部分要以分号来分隔。第三行中的[]表示条件测试,常用的条件测试有下面几种:

[-f"$file" ]判断$file是否是一个文件

[$a-lt 3 ]判断$a的值是否小于3,同样-gt和-le分别表示大于或小于等于

[-x"$file" ]判断$file是否存在且有可执行权限,同样-r测试文件可读性

[-n"$a" ]判断变量$a是否有值,测试空串用-z

["$a"="$b" ]判断$a和$b的取值是否相等

[ cond1-a cond2 ]判断cond1和cond2是否同时成立,-o表示cond1和cond2有一成立

要注意条件测试部分中的空格。在方括号的两侧都有空格,在-f、-lt、=等符号两侧同样也有空格。如果没有这些空格,Shell解释脚本的时候就会出错。

$#表示包括$0在内的命令行参数的个数。在Shell中,脚本名称本身是$0,剩下的依次是$0、$1、$2…、${10}、${11},等等。$*表示整个参数列表,不包括$0,也就是说不包括文件名的参数列表。

现在我们明白第三行的含义是如果脚本文件的参数少于三个,则执行if和fi语句之间的内容。然后,从第四行到第十一行之间的内容在Shell Script编程中被称为Here文档,Here文档用于将多行文本传递给某一命令。Here文档的格式是以<<开始,后跟一个字符串,在 Here文档结束的时候,这个字符串同样也要出现,表示文档结束。在本例中,Here文档被输出给cat命令,也即将文档内容打印在屏幕上,起到显示帮助信息的作用。

第十二行的exit是Linux的命令,表示退出当前进程。在Shell脚本中可以使用所有的Linux命令,利用上面的cat和exit,从一方面来说,熟练使用Linux命令也可以大大减少Shell脚本的长度。

十四、十五两句是赋值语句,分别将第一和第二参数赋值给变量OLD和NEW。紧接下来的两句是注释,注释下面的两条shift的作用是将参数列表中的第一个和第二个参数删除,后面的参数依次变为新的第一和第二参数,注意参数列表原本也不包括$0。

然后,自二十一行到三十一行是一个循环语句。Shell Script中的循环有下面几种格式:

while [ cond1 ]&&{||} [ cond2 ]…; do

done

for var in…; do

done

for(( cond1; cond2; cond3)) do

done

until [ cond1 ]&&{||} [ cond2 ]…; do

done

在上面这些循环中,也可以使用类似C语言中的break和continue语句中断当前的循环操作。第二十一行的循环是将参数列表中的参数一个一个地放入变量file中。然后进入循环,判断file是否为一个文件,如果是文件的话,则用 sed命令搜索和生成新的文件名。sed基本上可以看成一个查找替换程序,从标准输入,例如管道读入文本,并将结果输出到标准输出,sed使用正则表达式进行搜索。在第二十三行中,backtick(`)的作用是取出两个backtick之间的命令输出结果,在这里,也就是将结果取出赋给变量 newfile。此后,判断newfile是否已经存在,否则就把file改成newfile。这样我们就明白这个脚本的作用了,Shell Script编写的其他脚本与此相似,只不过是语法和用法稍有不同而已。

通过这个例子我们明白了Shell Script的编写规则,但还有几件事情需要讲述一下。

第一个,除了if语句之外,Shell Script中也有类似C语言中多分支结构的case语句,它的语法是:

case var in

pattern 1)

…;;

pattern 2)

…;;

*)

…;;

esac

我们再就下面一个例子,看看case语句的用法。

while getopts vc: OPTION

do

case$OPTION in

c) COPIES=$OPTARG

ehco"$COPIES";;

v) echo"suyang";;

\?) exit 1;;

esac

done

上面的getopts类似于C语言提供的函数getopts,在Shell Script中,getopts经常和while语句联合起来使用。getopts的语法如下:

getopts option_string variable

option_string中包含一串单字符选项,若getopts在命令行参数中发现了连字符,那么它会将连字符之后的字符与option_string进行比较,若匹配成功,则把变量variable的值设为该选项,若无匹配,则把变量的值设为?。有时候,选项还会带一个值,例如-c5等,这时要在option_string中该选项字母后面加上一个冒号,getopts发现冒号后,会读取该值,然后将该值放入特殊变量OPTARG中。这个命令比较复杂,如有需要,读者可以详细参阅Shell编写的相关资料。

上面这个循环的作用就是依次取出脚本名称后面的选项,进行处理,如果输入了非法选项,则进入"?指定的部分,退出脚本程序。

第二个,Bash提供了一种用于交互式应用的扩展select,用户可以从一组不同的值中进行选择。其语法如下:

select var in…; do

break;

done

例如,下面这段程序的输出是:

#!/bin/bash

echo"Your choice?"

select var in"a""b""c"; do

break

done

echo$var

----------------------------

Your choice?

1) a

2) b

3) c

第三,Shell Script中也可以使用自定义的函数,其语法形式如下:

functionname()

{

}

例如我们可以把上面第二个例子中第四到第十二行放入一个名为help函数体内,以后每次调用的时候直接写help即可。函数中处理函数调用参数的方法是,直接用上面讲过的$1、$2来分别表示第一、第二个参数,用$*表示参数列表。

第四,我们也可以在Shell下调试Shell Script脚本,当然最简单的方法就是用echo输出查看变量取值了。Bash也提供了真正的调试方法,就是执行脚本的时候用-x参数。

sh?x filename.sh

这会执行脚本并显示脚本中所有变量的取值,也可以使用参数-n,它并不执行脚本,只是返回所有的语法错误。

Linux Shell编程从初学到精通的目录

《linux shell编程从初学到精通》

第1章 shell脚本编程概述 1

1.1 linux和shell概述 2

1.1.1 linux简介 2

1.1.2 shell简介 3

1.2 shell脚本编程的优势 5

1.3第一个shell脚本例子 6

1.3.1 shell脚本的基本元素 6

1.3.2执行shell脚本 7

1.4本章小结 8

第2章 linux文件系统和文本编辑器 9

2.1用户和用户组管理 10

2.1.1用户管理常用命令 10

2.1.2用户组管理常用命令 14

2.2文件和目录操作 16

2.2.1文件操作常用命令 17

2.2.2目录操作常用命令 21

2.2.3文件和目录权限管理 25

2.2.4查找文件命令——find 28

2.3文本编辑器 31

.2.3.1 vi编辑器 31

2.3.2 gedit编辑器 35

2.4本章小结 36

2.5上机提议 37

第3章正则表达式 39

3.1正则表达式基础 40

3.2正则表达式的扩展 43

3.3通配 44

3.4 grep命令 46

3.4.1 grep命令基本用法 47

3.4.2 grep和正则表达式结合使用的一组例子 53

3.4.3 grep命令族简介 57

3.5本章小结 58

3.6上机提议 58

第4章 sed命令和awk编程 60

4.1 sed命令基本用法 61

4.2 sed编程的一组例子 63

4.2.1 sed命令选项的一组例子 63

4.2.2 sed文本定位的一组例子 66

4.2.3 sed基本编辑命令的一组例子 68

4.2.4 sed高级编辑命令的一组例子 76

4.3 awk编程 79

4.3.1 awk编程模型 80

4.3.2 awk调用方法 80

4.4 awk编程的一组例子 81

4.4.1 awk模式匹配 81

4.4.2记录和域 82

4.4.3关系和布尔运算符 84

4.4.4表达式 86

4.4.5系统变量 88

4.4.6格式化输出 89

4.4.7内置字符串函数 91

4.4.8向awk脚本传递参数 93

4.4.9条件语句和循环语句 94

4.4.10数组 95

4.5本章小结 99

4.6上机提议 99

第5章文件的排序、合并和分割 101

5.1 sort命令 102

5.1.1 sort命令的基本用法 102

5.1.2 sort和awk的联合用法 106

5.2 uniq命令 108

5.3 join命令 111

5.4 cut命令 114

5.5 paste命令 115

5.6 split命令 117

5.7 tr命令 119

5.8 tar命令 122

5.9本章小结 125

5.10上机提议 126

第6章变量和引用 128

6.1变量 129

6.1.1变量替换和赋值 129

6.1.2无类型的shell脚本

变量 132

6.1.3环境变量 133

6.1.4位置参数 140

6.2引用 141

6.2.1全引用和部分引用 142

6.2.2命令替换 143

6.2.3转义 146

6.3本章小结 149

6.4上机提议 150

第7章退出、测试、判断及操作符 152

7.1退出状态 153

7.2测试 154

7.2.1测试结构 154

7.2.2整数比较运算符 154

7.2.3字符串运算符 156

7.2.4文件操作符 157

7.2.5逻辑运算符 159

7.3判断 161

7.3.1简单if结构 162

7.3.2 exit命令 163

7.3.3 if/else结构 164

7.3.4 if/else语句嵌套 166

7.3.5 if/elif/else结构 169

7.3.6 case结构 172

7.4运算符 174

7.4.1算术运算符 175

7.4.2位运算符 176

7.4.3自增自减运算符 178

7.4.4数字常量 178

7.5本章小结 180

7.6上机提议 180

第8章循环与结构化命令 182

8.1 for循环 183

8.1.1列表for循环 183

8.1.2不带列表for循环 187

8.1.3类c风格的for循环 188

8.2 while循环 191

8.2.1计数器控制的while循环 191

8.2.2结束标记控制的while循环 193

8.2.3标志控制的while循环 195

8.2.4命令行控制的while循环 196

8.3 until循环 198

8.4嵌套循环 199

8.5循环控制符 203

8.5.1 break循环控制符 203

8.5.2 continue循环控制符 206

8.6 select结构 208

8.7本章小结 210

8.8上机提议 210

第9章变量的高级用法 212

9.1内部变量 213

9.2字符串处理 221

9.3有类型变量 227

9.4间接变量引用 230

9.5 bash数学运算 232

9.5.1 expr命令 232

9.5.2 bc运算器 234

9.6本章小结 235

9.7上机提议 236

第10章 i/o重定向 238

10.1管道 239

10.1.1管道简介 239

10.1.2 cat和more命令 240

10.1.3 sed命令与管道 242

10.1.4 awk命令与管道 244

10.2 i/o重定向 246

10.2.1文件标识符 246

10.2.2 i/o重定向符号及其用法 248

10.2.3 exec命令的用法 252

10.2.4代码块重定向 255

10.3命令行处理 258

10.3.1命令行处理流程 258

10.3.2 eval命令 261

10.4本章小结 264

10.5上机提议 264

第11章linux/unix shell类型与区别 266

11.1 linux/unix shell起源与分类 267

11.2 dash简介 268

11.3 tcsh简介 270

11.4 korn shell简介 275

11.5本章小结 280

第12章子shell与进程处理 281

12.1子shell 282

12.1.1内建命令 282

12.1.2圆括号结构 285

12.2 shell的限制模式 290

12.3进程处理 292

12.3.1进程和作业 294

12.3.2作业控制 295

12.3.3信号 299

12.3.4 trap命令 302

12.4本章小结 305

12.5上机提议 305

第13章函数 307

13.1函数的定义和基本知识 308

13.2向函数传递参数 311

13.3函数返回值 314

13.4函数调用 315

13.4.1脚本放置多个函数 316

13.4.2函数相互调用 317

13.4.3一个函数调用多个函数 319

13.5局部变量和全局变量 320

13.6函数递归 321

13.6.1使用局部变量的递归 322

13.6.2不使用局部变量的递归 323

13.7本章小结 325

13.8上机提议 326

第14章别名、列表及数组 328

14.1别名 329

14.2列表 332

14.3数组 334

14.3.1数组的基本用法 335

14.3.2数组的特殊用法 339

14.3.3用数组实现简单的数据结构 343

14.4本章小结 349

14.5上机提议 349

第15章一些混杂的主题 352

15.1脚本编写风格 353

15.1.1缩进 353

15.1.2{}的格式 355

15.1.3空格和空行的用法 355

15.1.4判断和循环的编程风格 356

15.1.5命名规范 357

15.1.6注释风格 358

15.2脚本优化 359

15.2.1简化脚本 359

15.2.2保持脚本的灵活性 361

15.2.3给用户足够的提示 362

15.3 linux中的特殊命令 364

15.3.1 shift命令 364

15.3.2 getopts命令 367

15.4交互式和非交互式shell脚本 369

15.4.1非交互式shell脚本 369

15.4.2交互式shell脚本 371

15.5/dev文件系统 372

15.5.1/dev文件系统基础知识 372

15.5.2/dev/zero伪设备 374

15.5.3/dev/null伪设备 375

15.6/proc文件系统 376

15.6.1使用/proc/sys优化系统参数 378

15.6.2查看运行中的进程信息 379

15.6.3查看文件系统信息 380

15.6.4查看网络信息 380

15.7 shell包装 381

15.8带颜色的脚本 383

15.9 linux脚本安全 389

15.9.1使用shc工具加密shell脚本 390

15.9.2 linux shell脚本编写的病毒 391

15.9.3 linux shell中的木马 392

15.10本章小结 392

15.11上机提议 393

第16章 shell脚本调试技术 395

16.1 shell脚本调试概述 396

16.2 shell脚本调试技术 398

16.2.1使用trap命令 398

16.2.2使用tee命令 401

16.2.3调试钩子 403

16.2.4使用shell选项 404

16.3本章小结 409

16.4上机提议 409

第17章 bash shell编程范例 412

17.1将文本文件转化为html

文件 413

17.2查找文本中n个出现频率最高的单词 417

17.3伪随机数的产生和应用 419

17.4 crontab的设置和应用 423

17.5使用mysql数据库 426

17.5.1 mysql基础 426

17.5.2 shell脚本使用mysql 427

17.6 linux服务器性能监控系统 432

17.6.1 ganglia简介及安装 432

17.6.2提取服务器性能参数名称及数据 435

17.6.3动态更新服务器监控数据 441

17.7本章小结 443

17.8上机提议 443

附录 445

附录a posix标准简介 446

附录b常用ascii码对照表 447

附录c linux信号及其意义 452

附录d bash内建变量索引 453

附录e bash内建命令索引 455

参考文献 458

LINUX快速入门第八章:Shell基础

我们平时所说的 Shell可以理解为 Linux系统提供给用户的使用界面。Shell为用户提供了输入命令和参数并可得到命令执行结果的环境。当一个用户登录 Linux之后,系统初始化程序 init就根据/etc/passwd文件中的设定,为每个用户运行一个被称为 Shell(外壳)的程序。

确切地说,Shell是一个命令行解释器,它为用户提供了一个向 Linux内核发送请求以便运行程序的界面系统级程序,用户可以用 Shell来启动、挂起、停止甚至编写一些程序。

Shell处在内核与外层应用程序之间,起着协调用户与系统的一致性、在用户与系统之间进行交互的作用。图 1是 Linux系统层次结构图,Shell接收用户输入的命令,并把用户的命令从类似 abed的 ASCII码解释为类似 0101的机器语言,然后把命令提交到系统内核处理;当内核处理完毕之后,把处理结果再通过 Shell返回给用户。

换句话说:

Shell是一个用 C语言编写的程序,它是用户使用 Linux的桥梁。Shell既是一种命令语言,又是一种程序设计语言。

Shell是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务。

Ken Thompson的 sh是第一种 Unix Shell,Windows Explorer是一个典型的图形界面 Shell。

Shell与其他 Linux命令一样,都是实用程序,但它们之间还是有区别的。一旦用户注册到系统后,Shell就被系统装入内存并一直运行到用户退出系统为止;而一般命令仅当被调用时,才由系统装入内存执行。

与一般命令相比,Shell除了是一个命令行解释器,同时还是一门功能强大的编程语言,易编写,易调试,灵活性较强。作为一种命令级语言,Shell是解释性的,组合功能很强,与操作系统有密切的关系,可以在 Shell脚本中直接使用系统命令。大多数 Linux系统的启动相关文件(一般在/etc/rc.d目录下)都是使用 Shell脚本编写的。

同传统的编程语言一样,Shell提供了很多特性,这些特性可以使 Shell脚本编程更为有用,如数据变量、参数传递、判断、流程控制、数据输入和输出、子程序及中断处理等。

说了这么多,其实我们在 Linux中操作的命令行界面就是 Linux的 Shell,也就是 Bash,但是我们的图形界面是 Shell吗?其实从广义讲,图形界面当然也是 Shell,因为它同样用来接收用户的操作,并传递到内核进行处理。不过,这里的 Shell主要指的是 Bash。

Shell脚本

Shell脚本(shell script),是一种为 shell编写的脚本程序。

业界所说的 shell通常都是指 shell脚本,但读者朋友要知道,shell和 shell script是两个不同的概念。

由于习惯的原因,简洁起见,本文出现的"shell编程"都是指 shell脚本编程,不是指开发 shell自身。

Shell的分类

目前 Shell的版本有很多种,如 Bourne Shell、C Shell、Bash、ksh、tcsh等,它们各有特点,下面简要介绍一下。

最重要的 Shell是 Bourne Shell,这个命名是为了纪念此 Shell的发明者 Steven Bourne。从 1979年起,UNIX就开始使用 Boume Shell。Bourne Shell的主文件名为 sh,开发人员便以 sh作为 Bourne Shell的主要识别名称。

虽然 Linux与 UNIX一样,可以支持多种 Shell,但 Boume Shell的重要地位至今仍然没有改变,许多 UNIX系统中仍然使用 sh作为重要的管理工具。它的工作从开机到关机,几乎无所不包。在 Linux中,用户 Shell主要是 Bash,但在启动脚本、编辑等很多工作中仍然使用 Bourne Shell。

C Shell是广为流行的 Shell变种。C Shell主要在 BSD版的 UNIX系统中使用,发明者是柏克莱大学的 Bill Joy。C Shell因为其语法和 C语言类似而得名,这也使得 UNIX的系统工程师在学习 C Shell时感到相当方便。

Bourne Shell和 C Shell形成了 Shell的两大主流派别,后来的变种大都吸取这两种 Shell的特点,如 Korn、 tcsh及 Bash。

Bash Shell是 GNU计划的重要工具之一,也是 GNU系统中标准的 Shell。Bash与 sh兼容,所以许多早期开发出来的 Bourne Shell程序都可以继续在 Bash中运行。现在使用的 Linux就使用 Bash作为用户的基本 Shell。

Bash于 1988年发布,并在 1995-1996年推出Bash 2.0。在这之前,广为使用的版本是1.14,Bash 2.0增加了许多新的功能,以及具备更好的兼容性。表 2中详细列出了各版本的具体情况。

注意,Shell的两种主要语法类型有 Bourne和 C,这两种语法彼此不兼容。Boume家族主要包括 sh、ksh、Bash、psh、zsh;C家族主要包括 csh、tcsh(Bash和 zsh在不同程序上支持 csh的语法)。

本章讲述的脚本编程就是在 Bash环境中进行的。不过,在 Linux中除了可以支持 Bash,还可以支持很多其他的 Shell。我们可以通过/etc/shells文件来査询 Linux支持的 Shell。命令如下:

在 Linux中,这些 Shell是可以任意切换的,命令如下:

用户信息文件/etc/passwd的最后一列就是这个用户的登录 Shell。命令如下:

大家可以看到,root用户和其他可以登录系统的普通用户的登录 Shell都是/bin/bash,也就是 Linux的标准 Shell,所以这些用户登录之后可以执行权限允许范围内的所有命令。不过,所有的系统用户(伪用户)因为登录 Shell是/sbin/ndogin,所以不能登录系统。

笔记:

sh/bash/csh/Tcsh/ksh/pdksh等shell的区别

阅读剩余
THE END