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.变量定义 变量=前后不能有空格, ...
随机推荐
- 2019 竞技世界java面试笔试题 (含面试题解析)
本人3年开发经验.18年年底开始跑路找工作,在互联网寒冬下成功拿到阿里巴巴.今日头条.竞技世界等公司offer,岗位是Java后端开发,最终选择去了竞技世界. 面试了很多家公司,感觉大部分公司考察的点 ...
- mysql-表关系介绍(应用较多)
目录 表之间的关系(重点) foreign key (外键) 级联操作 (cascade) 两种级联操作 外键的使用 多对一(一对多) 多对多 一对一关系 表之间的关系(重点) foreign key ...
- Java自学-类和对象 引用
什么是Java中的引用? 引用的概念,如果一个变量的类型是 类类型,而非基本类型,那么该变量又叫做引用. 步骤 1 : 引用和指向 new Hero(); 代表创建了一个Hero对象 但是也仅仅是创建 ...
- Java自学-数组 创建数组
Java 如何创建一个数组 数组是一个固定长度的,包含了相同类型数据的 容器 步骤 1 : 声明数组 int[] a; 声明了一个数组变量. []表示该变量是一个数组 int 表示数组里的每一个元素都 ...
- Java自学-控制流程 If
Java的 If 条件语句 条件判断 示例 1 : if if(表达式1){ 表达式2: } 如果表达式1的值是true, 就执行表达式2 public class HelloWorld { publ ...
- Django:信号的使用
信号 Django中提供了"信号调度",用于在框架执行操作时解耦.通俗来讲,就是一些动作发生的时候,信号允许特定的发送者去提醒一些接受者. 应用:比如插入数据到数据库,插入之前写日 ...
- SAP成都研究院的小伙伴们庆祝公司再次获得2019年最佳雇主的场景
日前,怡安集团旗下全球领先的人力资本管理咨询机构怡安翰威特与全球高管寻聘和领导力顾问公司史宾沙旗下Kincentric共同揭晓2019年中国最佳雇主榜单.SAP中国研究院凭借企业的创新文化和多元环境, ...
- js跳出循环的方法区别(break,continue,return)(转载)
转自:http://blog.csdn.net/fxss5201/article/details/52980138 js编程语法之break语句: break语句会使运行的程序立刻退出包含在最内层的循 ...
- window安装gcc、g++、make等编译环境
1. MinGW官网下载:http://www.mingw.org 点击右上角Downloads 点击下载 mingw-get-setup.exe 2. 百度网盘(2019年4月从官网下 ...
- beta版本——第三次冲刺
第三次冲刺 (1)SCRUM部分☁️ 成员描述: 姓名 李星晨 完成了哪个任务 认证学校那一栏增加检测机制的ui设计 花了多少时间 1h 还剩余多少时间 1h 遇到什么困难 没有困难 这两天解决的进度 ...