shell语言详解

shell语言详解

Shell变量tips

定义变量时,等号周围不能有空格;

定义变量中不能有空格;

变量使用时,前面要加$;

建议使用变量时将变量用花括号括起来;

只读变量可以在变量前加readonly

#!/bin/bash

myUrl="https://www.google.com"

readonly myUrl

删除变量可以使用unset,变量被删除后不能再次使用,unset不能删除只读变量;

字符串

单引号字符串里任何字符都会原样输出,单引号字符串中变量是无效的;

单引号字符串中不能出现单独的一个单引号,加转义字符也不行;

双引号里可以有变量;

双引号里可以出现转义字符;

获取字符串长度string="abcd" echo ${#string},即表示变量的$符号后加一个#

提取子字符串

string="runoob is a great site"

echo ${string:1:4} # 输出 unoo

数组

数组元素间用空格分割;

取数组元素${数组名[下标]};

取数组所有元素${数组名[@]};

获取数组长度${#数组名[@]};

注释

#表示注释;

#多行注释

:<

注释内容。。。

EOF

##或者

:<<'

...

'

##或者

:<

...

!

传参

向脚本传递参数,脚本内使用的格式为$n,n代表第几个参数,$1表示第一个参数;

$0表示执行的文件名,包含文件路径;

$#表示传递到脚本参数的个数;

$*以一个单字符串的形式显示所有向脚本传递的参数;

$$脚本运行的当前进程的ID号;

$!后台运行的最后一个进程的ID号;

$@与$*相同,但是使用时加引号,并在引号中返回每个参数(不是单字符串了)

如使用"$@"则返回"$1" "$2" … "$n"

$-显示Shell使用的当前选项;

$?显示最后命令的退出状态;

运算

要进行数学运算,需要使用斜点val=expr 2 + 2

表达式和运算符之间要有空格,这点要区分变量赋值,变量赋值等号周围不能加空格;

方括号[ ]等价与test,方括号周边要加空格;

乘号前面必须要加反斜杠[ $a \* $b ];

布尔运算:

!取非;

-o取或;

-a取与;

逻辑运算:

&&逻辑与;

||逻辑或;

字符串运算:

=检查字符串相等;

!=检查字符串不等;

-z检查字符串长度是否为0,为0返回true;

-n检查字符串是否不为0,不为0返回true;

$检测字符串是否为空,不为空返回true;

文件测试:

-b file检查文件是否为块设备,是则返回true;

-c file检查文件是否是字符设备,是则返回true;

-d file检查文件是否是目录,是则返回true;

-f file检查文件是否是普通文件,是则返回true;

-g file检查文件是否设置了SGID位,是则返回true;

-k file检查文件是否设置了粘着位sticky bit,是则返回true;

-p file检查文件是否是有名管道,是则返回true;

-u file检查文件是否设置了SUID位,是则返回true;

-r file检查文件是否可读,是则返回true;

-w file检查文件是否可写,是则返回true;

-x file检查文件是否可执行,是则返回true;

-s file检查文件是否为空(文件大小是否大于0),不为空则返回true;

-e file检测文件(包括目录)是否存在,是则返回true;

-S判断文件是否是socket;

-L检测文件是否存在合并是一个符号链接;

命令行展开{}会在脚本中展开表达式,..表示递归,第三位表示步长

如:

{1..5}展开就是1 2 3 4 5

{1..5..2}展开就是1 3 5

别名alias为某命令产生一个别名

unalias取消这个别名

历史命令history会展示之前的历史命令,命令前有编号

{!num}运行history中对应数字的命令

{!!}运行上一条命令

快捷键^表示CTRL键

^A移动光标到行首

^E移动光标到行尾

^U剪切这一行

^K剪切光标之后的所有内容

^Y粘贴之前剪切的内容

^L等同于clear,清屏

^D退出当前程序,正常退出

^C退出当前程序,非正常退出

^Z暂停(挂起)当前程序,并放入后台

^S暂停屏幕输出

^Q恢复屏幕输出

^R在历史命令中搜索

正则表达式元字符基本正则字符^:行首

$:行尾

[]:选字,如[abc]则为abc中的任意一个,还可以范围匹配[a-c],表示abc

*:任意字符,包括空,出现任意次

.:任意一个字符(非换行),有且只有一个

扩展正则字符():分组,被其包裹的部分是一个整体,并获取这个匹配,可以在后面使用

{}:匹配前一个分组的某些次数

?:前一个字符的零次或一次,若前面是一个限制符时,匹配模式是非贪婪的(即尽可能匹配少的字符)

+:前面一个字符的一次及以上

|:表示或者,同时过滤多个字符串

\:转义字符(escape char),跟在其后的,表示其字符本身含义,而不是其正则含义,或者将普通字符转义为特殊字符

\b:匹配一个单词边界,也就是单词和空格间的位置

\B:匹配非单词边界

\cx:匹配由x指明的控制字符,如\cM匹配^M,x必须是字母

\d:匹配一个数字

\D:匹配一个非数字

\f:匹配一个换页符,等价于\x0c和\cL

\n:匹配一个换行符,等价于\x0a和\cJ

\r:匹配一个回车符,等价于\x0d和\cM

\s:匹配一个空白字符,包括空格,制表,换页等

\S:匹配任何非空白符

\t:匹配一个制表符

\v:匹配一个垂直制表符

\w:匹配字母,数字,下划线(如c语言中合法的变量名)

\W:匹配非字母,数字,下划线

\xn:匹配n,其中n是16进制转义值,必须为两个字符

\num:匹配num,其中num是一个正整数,是对所获取的匹配的引用,如(.)\1匹配两个连续的相同字符

\n:n是一个数字,标识一个8进制转义值或一个向后引用。如果\n之前有至少n个获取的子表达式,则n为向后引用,否则,如果n为八进制数字,则n为一个八进制转义值

\nm:n,m都是一个数字,标识一个八进制转义值,或者一个向后引用,最多到99

\nml:匹配八进制数字,如n为0-3,m和l为0-7,则匹配八进制转义值nml

\un:匹配n,其中n是四个16进制数字表示的Unicode字符,如\u00A9表示?

组合字符^$:表示空行(啥也没有)

.*:匹配至少一个的所有内容,没有空

^.*:匹配任意多个字符开头

.*$:匹配任意多个字符结尾

[^abc]:反选,匹配非abc的任意字符

a{n, m}:匹配前一个分组的至少n次,至多m次,如a{1, 3},匹配 a,aa,aaa

a{n, }:匹配前一个分组的至少n次,至多不限

a{, m}:匹配前一个分组的至多m次,至少不限

a{n}:匹配前一个分组正好n次

(?:pattern):匹配,但不获取这个匹配结果

(?=pattern):正向肯定预查,在任何匹配pattern的字符串处匹配查找字符串

(?!pattern):正向否定预查,在任何不匹配pattern的字符串处匹配查找字符串

(?<=pattern):反向肯定预查,在任何匹配pattern的字符串处匹配查找字符串,方向和正向相反

(?

[]+:方括号内的内容的一次或多次

<>:定位单词的左侧和右侧

字符簇[[:alpha:]]:任何字母

[[:digit:]]:任何数字

[[:alnum:]]:任何字母和数字

[[:space:]]:任何空白字符

[[:upper:]]:任何大写字母

[[:lower:]]:任何小写字母

[[:punct:]]:任何标点符号

[[:xdigit:]]:任何16进制的数字

优先级相同优先级的从左到右运算,不同优先级的先高后低

运算符

描述

\

转义符

(), (?:), (?=), []

圆括号与方括号

*, +, ?, {n}, {n,},{n,m},{,m}

限定符

^, $, \任何元字符、任何字符

定位点和序列

`

`

修饰符i:忽略大小写

g:全局匹配

m:多行匹配

s:.中包含换行\n

相关推荐

餐饮店装修多少钱一平方合适?(2025年最新报价与成本控制技巧)
如何吃荸荠比较好
365bet体育在线娱乐场

如何吃荸荠比较好

📅 06-27 👁️ 4574
Shopee虾皮平台退款时间大概要多久?取消订单会扣分吗?
ccq是什么游戏
365365094

ccq是什么游戏

📅 07-20 👁️ 3863
长知识丨为什么中医界被称为“杏林”
365BET-官网

长知识丨为什么中医界被称为“杏林”

📅 07-19 👁️ 8840
丨总结荣耀8X
365BET-官网

丨总结荣耀8X

📅 07-09 👁️ 2273
NBA扩军确认!西雅图和拉斯维加斯将新增球队,杜兰特或回归老母队
【防扯皮】串口数据监听
365bet体育在线娱乐场

【防扯皮】串口数据监听

📅 07-08 👁️ 4497
翻墙后必看网站推荐
365bet体育在线娱乐场

翻墙后必看网站推荐

📅 07-27 👁️ 9012