Shell的语法

Shell的语法:

  1. 变量:字符串、数字、环境和参数;
  2. 条件:shell中的布尔值;
  3. 程序控制:ifelifforwhileuntilcase
  4. 命令列表;
  5. 函数;
  6. Shell内置命令;
  7. 获取命令的执行结果;
  8. Here文档;

1.变量

shell里,使用变量之前通常并不需要事先为它们做出声明。你只有通过使用它们来创建它们。

使用引号

一般情况下,脚本文件中的参数以空白分隔。如果你想在一个参数中包含一个或多个空白字符,你必须给参数加上引号;

环境变量

当一个shell脚本程序执行时,一些变量会根据环境射中的值进行过初始化。这些变量通常用大写字母做名字,以便把他们和用户在脚本程序里定义的变量区分开来,后者按惯例用小写字母做名字。

 

主要的环境变量表

环境变量

说明

$HOME

当前用户的家目录

$PATH

以冒号分隔的用来搜索命令的目录列表

$PS1

命令提示符,通常是$字符,但在bash中,你可以使用一些更复杂的值。

$PS2

二级提示符,用来提示后续的输入,通常是>字符

$IFS

输入域分隔符。当shell读取输入时,它给出用来分隔单词的一组字符,他们通常是空格,制表符和换行符

$0

Shell脚本的名字

$#

传递给脚本的参数个数

$$

Shell脚本的进程号,脚本程序通常会用它来生成一个唯一的临时文件。

 

参数变量

如果脚本程序在调用时带有参数,一些额外的变量就会被创建。即使没有传递任何参数,环境变量$#也依然存在,只不过它的值是0

 

参数变量

参数变量

说明

$1,$2,...

脚本程序的参数

$*

在一个变量中列出所有的参数,各个参数之间用环境变量IFS中的第一个字符分隔开。

$@

它是$*的一个精巧的变体,它不使用IFS环境变量,所有即使IFS为空,参数也不会挤在一起

 

2.条件

所有程序设计语言的基础是对条件进行测试判断,并根据测试结果采取不同行为的能力。

test[命令

在实际工作用,大多数脚本程序都会广泛使用shell的布尔判断命令[test.在一些系统上,这俩个命令的作用是一样的,只是为了增强可读性,当使用[命令时,我们还使用符号]结尾。

test命令可以归为3类:字符串比较、算术比较和文件有关的条件测试:

 

字符串比较

字符串比较

结果

sting1 = string2

如果俩个字符串相同测试结果为真

sting1 != string2

如果俩个字符串不同测试结果为真

-n string

如果字符串不为空测试结果为真

-z string

如果字符串为null(一个空串)则结果为真

 

算术比较

算术比较

结果

expression1 -eq expression2

如果俩个表达式相等则结果为真

expression1 -ne expression2

如果俩个表达式不等则结果为真

expression1 -gt expression2

如果expression1大于expression2则结果为真

expression1 -ge expression2

如果expression1大于等于expression2则结果为真

expression1 -lt expression2

如果expression1小于expression2则结果为真

expression1 -le expression2

如果expression1小于等于expression2则结果为真

! expression

如果表达式为假则结果为真,反之亦然

 

文件条件测试

文件条件测试

结果

-d  file

如果文件是一个目录测试结果为真

-e  file

如果文件存在则结果为真。要注意的是历史上-e选项不可移植,所以通常使用的是-f选项

-f  file

如果文件是一个普通文件则结果为真

-g  file

如果文件的set-group-id位被设置则结果为真

-r  file

如果文件可读则结果为真

-s  file

如果文件的大小不为0则结果为真

-u  file

如果文件的set-user-id位被设置则结果为真

-w  file

如果文件可写则结果为真

-x  file

如果文件可执行则结果为真

 

3.控制结构

shell有一组控制结果,它们与其他程序设计语言中的控制结构很相似;

  1. if语句
  2. elif语句
  3. 一个与变量相关的问题
  4. for语句
  5. while语句
  6. until语句
  7. case语句
  8. 命令列表
  9. 语句块

4.函数

你可以在shell定义函数。如果你想编写大型的shell脚本程序。

5.命令

内部执行俩类命令:一类是可以在命令提示符中执行的“普通”命令,也称为外部命令,一类是我们前面提到的“内置”命令,也称之为内部命令。内置命令是在shell内部实现的,它们不能作为外部程序被调用。

  1. break命令
  2. :命令
  3. continue命令
  4. .命令
  5. echo命令
  6. eval命令
  7. exec命令
  8. exit n命令
  9. export命令
  10. expr命令

expr命令的功能十分强大,它可以完成许多表达式求值计算

 

表达式求值

说明

expr1 | expr2

如果expr1非零,则等于expr1,否则等于expr2

expr1 & expr2

只要有一个表达式为零,则等于零,否则等于expr

expr1 = expr2

等于

expr1 > expr2

大于

expr1 >= expr2

大于等于

expr1 < expr2

小于

expr1 <= expr2

小于等于

expr1 != expr2

不等于

expr1 + expr2

加法

expr1 - expr2

减法

expr1 * expr2

乘法

expr1 / expr2

除法

expr1 % expr2

取余

 

  1. printf命令

支持的转义序列

转义序列

说明

\”

双引号

\\

反斜线字符

\a

报警(响铃或峰鸣)

\b

退格字符

\c

取消进一步的输出

\f

进纸换页字符

\n

换行符

\r

回车符

\t

制表符

\v

垂直制表符

\000

八进制值000表示的单个字符

\xHH

十六进纸值HH表示的单个字符

 

转换字符

字符转换限定符

说明

d

输出一个十进制数字

c

输出一个字符

s

输出一个字符串

%

输出一个%字符

 

  1. return 命令
  2. set命令
  3. shift命令
  4. trap命令

X/Open规范里面规定的能够被捕获的比较重要的一些信号

信号

说明

HUP(1)

挂起,通常因终端掉线或用户退出而引发

INT(2)

中断,通常因按下Crtl+C组合键而引发

QUIT(3)

退出,通常因按下Crtl+\组合键而引发

ABRT(6)

中止,通常因某些严重的执行错误而引发

ALRM(14)

报警,通常用来处理超时

TERM(15)

终止,通常在系统关机时发送

 

  1. unset命令
  2. 另外俩个有用的命令和正则表达式:
      1. find命令

find命令主要的选项

选项

含义

-depth

在查看目录本身之前先搜索目录的内容

-follow

跟随符号链接

-maxdepths N

最多搜索N层目录

-mount( -xdev)

不搜索其他文件系统中的目录

 

find命令常用的测试

测试

含义

-atime N

文件在N天之前被最后访问过

-mtime N

文件在N天之前被最后修改过

-name pattern

文件名(不包括路径名)匹配提供的模式pattern被传递给find命令而不是由shell来处理,pattern必须总是用引号括起

-newer otherfile

文件比otherfile文件更新

-type c

文件的类型为cc是一个特殊类型,最常见的是d(目录)f(普通文件);

-user username

文件的拥有者是指定的用户username

 

操作符有俩种格式:短格式和长格式

操作符,短格式

操作符,长格式

含义

!

-not

测试取反

-a

-and

俩个测试都必须为真

-o

-or

俩个测试有一个必须为真

 

 

 

魔术字符串()-exec或者-ok

动作

含义

-exec command

执行一条命令,这是最常见的动作之一。

-ok command

-exec类似,但它在执行命令之前会支队每个要处理的文件,提示用户进行确认。这个动作必须使用\;字符进行结束

-print

打印文件名

-ls

对当前文件使用命令ls-dils

 

      1. grep命令

 

grep命令主要选项

选项

含义

-c

输出匹配行的数目,而不是输出匹配的行

-E

启动扩展表达式

-h

取消每个输出行的普通前缀,即匹配查询模式的文件名

-i

忽略大小写

-l

只列出包含匹配行的文件名,而不输出真正的匹配行

-v

对匹配模式取反,即搜索不匹配行而不是匹配行

 

      1. 正则表达式

最常使用的特殊字符

字符

含义

^

指向一行的开头

$

指向一行的结尾

.

任意单个字符

[]

方括号内包含一个字符范围,其中任何一个字符都可以被匹配;

 

方括号的特殊匹配模式

匹配模式

含义

[:alnum:]

字母与数字字符

[:alpha:]

字母

[:ascii:]

ASSII字符

[:blank:]

空格或制表符

[:cntrl:]

ASSII控制字符

[:digit:]

数字

[:graph:]

非控制、非空格字符

[:lower:]

小写字母

[:print:]

可打印字符

[:punct:]

标点符号字符

[:space:]

空白字符、包括垂直制表符

[:upper:]

大写字母

[:xdigit:]

十六进制数字

 

grep命令的选项

选项

含义

匹配是可选的,但最多匹配一次

*

必须匹配0次或多次

+

必须匹配1次或多次

{n}

必须匹配n

{n,}

必须匹配n次或n次以上

{n,m}

匹配次数在nm之间,包括nm

 

  1. 命令的执行
    1. 算术扩展
    2. 参数扩展

常见参数扩展方法

参数扩展

说明

${param:-default}

如果param为空,就把它设置为default的值

${#param}

给出param的长度

${param%word}

param的尾部开始删除与word匹配的最小部分,然后返回剩余部分

${param%%word}

param的尾部开始删除与word匹配的最长部分,然后返回剩余部分

${param#word}

param的头部开始删除与word匹配的最小部分,然后返回剩余部分

${param##word}

param的头部开始删除与word匹配的最长部分,然后返回剩余部分

 

 

7here文档

8、调试脚本程序

调试shell需要的命令行选项

命令行选项

set选项

说明

sh  -n  <script>

set -o noexec

set -n

只检查语法错误,不执行命令

sh  -v  <script>

set -o noexec

set -v

在执行命令之间回显它们

sh  -x  <script>

set -o noexec

set -x

在处理完命令之后回显它们

sh  -u  <script>

set -o noexec

set -u

如果使用了未定义的变量,就给出出错消息

 

posted @ 2019-11-15 02:20  jadeshu  阅读(423)  评论(0编辑  收藏  举报