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

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

Shell的语法的更多相关文章

  1. Shell函数语法

    Shell函数语法 定义函数: function   函数名(){ 指令... } 调用函数,方法1: 函数名 调用函数,方法2: 函数名  参数一   参数二 return在函数里面使用会跳出函数并 ...

  2. shell 的语法

    SHELL 的语法 n  变量:字符串,数字,环境和参数 n  条件:shell中的布尔值 n  程序控制:if, elif, for, while until, case n  命令列表 n  函数 ...

  3. shell脚本语法基础汇总

    shell脚本语法基础汇总 将命令的输出读入一个变量中,可以将它放入双引号中,即可保留空格和换行符(\n) out=$(cat text.txt) 输出1 2 3 out="$(cat te ...

  4. 运维shell全部语法进阶

    Linux运维之shell脚本进阶篇 一.if语句的使用 1)语法规则 1 2 3 4 5 6 7 8 9 if [条件]     then         指令 fi 或 if [条件];then ...

  5. U-Boot shell脚本语法

    /********************************************************************** * U-Boot shell脚本语法 * 说明: * 之 ...

  6. (转)shlex — 解析 Shell 风格语法

    原文:https://pythoncaff.com/docs/pymotw/shlex-parse-shell-style-syntaxes/171 这是一篇协同翻译的文章,你可以点击『我来翻译』按钮 ...

  7. shell 基础语法

    shell 基础语法 =============================================== 推荐:http://c.biancheng.net/cpp/shell/ ==== ...

  8. Shell脚本语法---在Makefile等文件…

    1. Shell脚本语法 1.1. 条件测试:test [ 命令test或[可以测试一个条件是否成立,如果测试结果为真,则该命令的Exit Status为0,如果测试结果为假,则命令的Exit Sta ...

  9. shell基本语法备忘

    1.第一行要写明shell种类 #!/bin/bash   2.打印输出 #!/bin/bashecho "Hello World !~"   3.变量定义 变量=前后不能有空格, ...

随机推荐

  1. C#实现AES加密解密

    AES   AES 高级加密标准(英语:Advanced Encryption Standard,缩写:AES),在密码学中又称Rijndael加密法 Rijndael(读作rain-dahl)是由美 ...

  2. Python进阶----计算机基础知识(操作系统多道技术),进程概念, 并发概念,并行概念,多进程实现

    Python进阶----计算机基础知识(操作系统多道技术),进程概念, 并发概念,并行概念,多进程实现 一丶进程基础知识 什么是程序: ​   程序就是一堆文件 什么是进程: ​   进程就是一个正在 ...

  3. js继承(十)

    一.原型链继承[子构造函数的原型对象是父构造函数的实例][对原型属性和方法的继承]1.每个构造函数[prototype]都有一个原型对象,原型对象中都包含一个指向构造函数的指针[constructor ...

  4. fileinput 配置项大全,从源码中翻出了很多属性,没那么多时间一一验证,特发出来给大家参考参考

    fileinput 配置项大全,从源码中翻出了很多属性,没那么多时间一一验证,特发出来给大家参考参考 fileinput 配置项大全 option 属性名 属性类型 描述说明 默认值 language ...

  5. 谷歌hack语法

    搜索标题 intitle:"登入" //加引号是精确搜索 搜索正文 intext:"登入" 在URL中搜索 inurl:"/phpmyadmin&qu ...

  6. 了解 npm install -S -D 的区别,看这篇就完事了

    一.npm install -S -D 的区别 npm install module_name -S 即 npm install module_name --save 写入dependencies n ...

  7. influxDB应用及TICK stack

    InfluxData平台用于处理度量和事件的时间序列平台,常被称为TICK stack,包含4个组件:Telegraf,influxDB,Chronograf和Kapacitor,分别负责时间序列数据 ...

  8. 一个.Net的混淆防反编译工具ConfuserEx

    给大家推荐一个.Net的混淆防反编译工具ConfuserEx. 由于项目中要用到.Net的混淆防反编译工具. 在网上找了很多.Net混淆或混淆防反编译工具,如.NET Reactor.Dotfusca ...

  9. oracle获取时间段之间的所有日期

    SELECT TO_CHAR(ADD_MONTHS(TO_DATE('2014-10', 'yyyy-MM'), ROWNUM - 1), 'yyyy-MM') as monthlist FROM D ...

  10. APP测试之MONKEY安装、使用

    1.先下载java的jdk;配置java变量 安装好之后会有两个文件夹一个是jdk 一个是jre(运行)然后配置好java环境变量:JAVA_HOME:C:\Program Files\Java\jd ...