Shell的语法
Shell的语法:
- 变量:字符串、数字、环境和参数;
- 条件:shell中的布尔值;
- 程序控制:if、elif、for、while、until、case;
- 命令列表;
- 函数;
- Shell内置命令;
- 获取命令的执行结果;
- 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有一组控制结果,它们与其他程序设计语言中的控制结构很相似;
- if语句
- elif语句
- 一个与变量相关的问题
- for语句
- while语句
- until语句
- case语句
- 命令列表
- 语句块
4.函数
你可以在shell定义函数。如果你想编写大型的shell脚本程序。
5.命令
内部执行俩类命令:一类是可以在命令提示符中执行的“普通”命令,也称为外部命令,一类是我们前面提到的“内置”命令,也称之为内部命令。内置命令是在shell内部实现的,它们不能作为外部程序被调用。
- break命令
- :命令
- continue命令
- .命令
- echo命令
- eval命令
- exec命令
- exit n命令
- export命令
- 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 |
取余 |
- printf命令
支持的转义序列
|
转义序列 |
说明 |
|
\” |
双引号 |
|
\\ |
反斜线字符 |
|
\a |
报警(响铃或峰鸣) |
|
\b |
退格字符 |
|
\c |
取消进一步的输出 |
|
\f |
进纸换页字符 |
|
\n |
换行符 |
|
\r |
回车符 |
|
\t |
制表符 |
|
\v |
垂直制表符 |
|
\000 |
八进制值000表示的单个字符 |
|
\xHH |
十六进纸值HH表示的单个字符 |
转换字符
|
字符转换限定符 |
说明 |
|
d |
输出一个十进制数字 |
|
c |
输出一个字符 |
|
s |
输出一个字符串 |
|
% |
输出一个%字符 |
- return 命令
- set命令
- shift命令
- trap命令
X/Open规范里面规定的能够被捕获的比较重要的一些信号
|
信号 |
说明 |
|
HUP(1) |
挂起,通常因终端掉线或用户退出而引发 |
|
INT(2) |
中断,通常因按下Crtl+C组合键而引发 |
|
QUIT(3) |
退出,通常因按下Crtl+\组合键而引发 |
|
ABRT(6) |
中止,通常因某些严重的执行错误而引发 |
|
ALRM(14) |
报警,通常用来处理超时 |
|
TERM(15) |
终止,通常在系统关机时发送 |
- unset命令
- 另外俩个有用的命令和正则表达式:
- 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 |
文件的类型为c,c是一个特殊类型,最常见的是d(目录)和f(普通文件); |
|
-user username |
文件的拥有者是指定的用户username |
操作符有俩种格式:短格式和长格式
|
操作符,短格式 |
操作符,长格式 |
含义 |
|
! |
-not |
测试取反 |
|
-a |
-and |
俩个测试都必须为真 |
|
-o |
-or |
俩个测试有一个必须为真 |
魔术字符串()是-exec或者-ok
|
动作 |
含义 |
|
-exec command |
执行一条命令,这是最常见的动作之一。 |
|
-ok command |
与-exec类似,但它在执行命令之前会支队每个要处理的文件,提示用户进行确认。这个动作必须使用\;字符进行结束 |
|
|
打印文件名 |
|
-ls |
对当前文件使用命令ls-dils |
- grep命令
grep命令主要选项
|
选项 |
含义 |
|
-c |
输出匹配行的数目,而不是输出匹配的行 |
|
-E |
启动扩展表达式 |
|
-h |
取消每个输出行的普通前缀,即匹配查询模式的文件名 |
|
-i |
忽略大小写 |
|
-l |
只列出包含匹配行的文件名,而不输出真正的匹配行 |
|
-v |
对匹配模式取反,即搜索不匹配行而不是匹配行 |
- 正则表达式
最常使用的特殊字符
|
字符 |
含义 |
|
^ |
指向一行的开头 |
|
$ |
指向一行的结尾 |
|
. |
任意单个字符 |
|
[] |
方括号内包含一个字符范围,其中任何一个字符都可以被匹配; |
方括号的特殊匹配模式
|
匹配模式 |
含义 |
|
[: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} |
匹配次数在n到m之间,包括n和m |
- 命令的执行
- 算术扩展
- 参数扩展
常见参数扩展方法
|
参数扩展 |
说明 |
|
${param:-default} |
如果param为空,就把它设置为default的值 |
|
${#param} |
给出param的长度 |
|
${param%word} |
从param的尾部开始删除与word匹配的最小部分,然后返回剩余部分 |
|
${param%%word} |
从param的尾部开始删除与word匹配的最长部分,然后返回剩余部分 |
|
${param#word} |
从param的头部开始删除与word匹配的最小部分,然后返回剩余部分 |
|
${param##word} |
从param的头部开始删除与word匹配的最长部分,然后返回剩余部分 |
7、here文档
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的语法的更多相关文章
- Shell函数语法
Shell函数语法 定义函数: function 函数名(){ 指令... } 调用函数,方法1: 函数名 调用函数,方法2: 函数名 参数一 参数二 return在函数里面使用会跳出函数并 ...
- shell 的语法
SHELL 的语法 n 变量:字符串,数字,环境和参数 n 条件:shell中的布尔值 n 程序控制:if, elif, for, while until, case n 命令列表 n 函数 ...
- shell脚本语法基础汇总
shell脚本语法基础汇总 将命令的输出读入一个变量中,可以将它放入双引号中,即可保留空格和换行符(\n) out=$(cat text.txt) 输出1 2 3 out="$(cat te ...
- 运维shell全部语法进阶
Linux运维之shell脚本进阶篇 一.if语句的使用 1)语法规则 1 2 3 4 5 6 7 8 9 if [条件] then 指令 fi 或 if [条件];then ...
- U-Boot shell脚本语法
/********************************************************************** * U-Boot shell脚本语法 * 说明: * 之 ...
- (转)shlex — 解析 Shell 风格语法
原文:https://pythoncaff.com/docs/pymotw/shlex-parse-shell-style-syntaxes/171 这是一篇协同翻译的文章,你可以点击『我来翻译』按钮 ...
- shell 基础语法
shell 基础语法 =============================================== 推荐:http://c.biancheng.net/cpp/shell/ ==== ...
- Shell脚本语法---在Makefile等文件…
1. Shell脚本语法 1.1. 条件测试:test [ 命令test或[可以测试一个条件是否成立,如果测试结果为真,则该命令的Exit Status为0,如果测试结果为假,则命令的Exit Sta ...
- shell基本语法备忘
1.第一行要写明shell种类 #!/bin/bash 2.打印输出 #!/bin/bashecho "Hello World !~" 3.变量定义 变量=前后不能有空格, ...
随机推荐
- 重新学习Spring2——IOC和AOP原理彻底搞懂
一.AOP 1 Spring AOP 的实现原理 是对OOP编程方式的一种补充.翻译过来为"面向切面编程". 1 AspectJ是静态代理的增强:所谓静态代理就是AOP框架会在便一 ...
- XXL-JOB使用命令行的方式启动python时,日志过多导致阻塞的解决方式
一.Runtime.getRuntime().exec()的阻塞问题 这个问题也不能算是XXL-JOB的问题,而是Java的Runtime.getRuntime().exec()造成的,Buffere ...
- 2019 龙采科技java面试笔试题 (含面试题解析)
本人3年开发经验.18年年底开始跑路找工作,在互联网寒冬下成功拿到阿里巴巴.今日头条.龙采科技等公司offer,岗位是Java后端开发,最终选择去了龙采科技. 面试了很多家公司,感觉大部分公司考察的点 ...
- aria2 https
https://github.com/aria2/aria2/issues/361 ... and also make sure that aria2 was built with HTTPS sup ...
- CGContextRef&CGMutablePathRef&UIBezierPath简单学习
简单的四句介绍 Quartz是一个二维绘图引擎,使用的是CoreGraphics库,同时支持iOS和Mac系统 CGContextRef:获取图形上下文.或者叫作用域,即画布,他是专门用来保存绘画期间 ...
- 如何用JS获取地址栏参数的方法
采用正则表达式获取地址栏参数: 写一个方法来进行正则匹配,同样也可以复用 function GetPar(name) { var reg = new RegExp("(^|&)&qu ...
- CNN原理
卷积神经网络(Convolutional Neural Network)的结构类似于神经网络,可以看做是对其的改进.它利用局部连接.权值共享.多核卷积.池化四个手段大大降低了参数的数目,使得网络的层数 ...
- maven下载jar demo
pom.xml <?xml version="1.0"?> <project xmlns="http://maven.apache.org/POM/4. ...
- Python_类的私有属性、私有方法
1.私有属性:只需要在初始化时,在属性名前加__ class Cup: #构造函数,初始化属性值 def __init__(self,capacity,color): #私有属性,只需要在属性名字前加 ...
- Windows 将FTP 映射到本地文件夹 --简化操作
转载自yutiantongbu Windows 将FTP 映射到本地文件夹 --简化操作 1.右键我的电脑,选择映射网络驱动器 2.选择"连接到可用与存储文档和图片的网站" 3.接 ...