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.变量定义 变量=前后不能有空格, ...
随机推荐
- C#实现AES加密解密
AES AES 高级加密标准(英语:Advanced Encryption Standard,缩写:AES),在密码学中又称Rijndael加密法 Rijndael(读作rain-dahl)是由美 ...
- Python进阶----计算机基础知识(操作系统多道技术),进程概念, 并发概念,并行概念,多进程实现
Python进阶----计算机基础知识(操作系统多道技术),进程概念, 并发概念,并行概念,多进程实现 一丶进程基础知识 什么是程序: 程序就是一堆文件 什么是进程: 进程就是一个正在 ...
- js继承(十)
一.原型链继承[子构造函数的原型对象是父构造函数的实例][对原型属性和方法的继承]1.每个构造函数[prototype]都有一个原型对象,原型对象中都包含一个指向构造函数的指针[constructor ...
- fileinput 配置项大全,从源码中翻出了很多属性,没那么多时间一一验证,特发出来给大家参考参考
fileinput 配置项大全,从源码中翻出了很多属性,没那么多时间一一验证,特发出来给大家参考参考 fileinput 配置项大全 option 属性名 属性类型 描述说明 默认值 language ...
- 谷歌hack语法
搜索标题 intitle:"登入" //加引号是精确搜索 搜索正文 intext:"登入" 在URL中搜索 inurl:"/phpmyadmin&qu ...
- 了解 npm install -S -D 的区别,看这篇就完事了
一.npm install -S -D 的区别 npm install module_name -S 即 npm install module_name --save 写入dependencies n ...
- influxDB应用及TICK stack
InfluxData平台用于处理度量和事件的时间序列平台,常被称为TICK stack,包含4个组件:Telegraf,influxDB,Chronograf和Kapacitor,分别负责时间序列数据 ...
- 一个.Net的混淆防反编译工具ConfuserEx
给大家推荐一个.Net的混淆防反编译工具ConfuserEx. 由于项目中要用到.Net的混淆防反编译工具. 在网上找了很多.Net混淆或混淆防反编译工具,如.NET Reactor.Dotfusca ...
- oracle获取时间段之间的所有日期
SELECT TO_CHAR(ADD_MONTHS(TO_DATE('2014-10', 'yyyy-MM'), ROWNUM - 1), 'yyyy-MM') as monthlist FROM D ...
- APP测试之MONKEY安装、使用
1.先下载java的jdk;配置java变量 安装好之后会有两个文件夹一个是jdk 一个是jre(运行)然后配置好java环境变量:JAVA_HOME:C:\Program Files\Java\jd ...