shell简介
什么是shell
什么是shell?简单说shell是用户和操作系统之间的接口。
Shell本身是一种用C语言编写的程序,从用户的角度来看,Shell是用户与Linux操作系统沟通的桥梁。用户既可以输入命令执行,又可以利用 Shell脚本编程,完成更加复杂的操作。
shell编程基础概念
书写规则
Bash也是大多数Linux系统默认的Shell。在一般情况下,人们并不区分 Bourne Shell和Bourne Again Shell,所以,在下面的文字中,我们可以看到#!/bin/sh,它同样也可以改为#!/bin/bash。
利用vi等文本编辑器编写Shell脚本的格式是固定的,如下:
#!/bin/sh
#comments
Your commands go here
其中 #! /bin/bash 在文件头写明该文件对应的解析脚本,如为/bin/bash
编辑完毕,将脚本存盘为filename.sh,文件名后缀sh表明这是一个Bash脚本文件。
chmod +x filename.sh
执行脚本的方法是:
./filename.sh
下面我们从经典的“hello world”入手,看一看最简单的Shell脚本的模样。
#!/bin/sh
#print hello world in the console window
a = "hello world"
echo $a
echo 打印(相等于C语言 :printf)
Shell Script是一种弱类型语言,使用变量的时候无需首先声明其类型。新的变量会在本地数据区分配内存进行存储,这个变量归当前的Shell所有,任何子进程都不能访问本地变量。这些变量与环境变量不同,环境变量被存储在另一内存区,叫做用户环境区,这块内存中的变量可以被子进程访问。
位置变量
./filename.sh zhangsan lisi wangwu zhaoliu
$0 $1 $2 $3 $4
$0表示命令名称
$0属于预定义变量
$0不属于位置变量
$1 ~$9表示从命令传入的参数, 如果有更多的参数 ,使用shift进行参数移动
变量类型
- 环境变量 : $SHELL
预定义(系统中已定义好的)变量:
$0 表示命令名 $# 位置参数的个数 (C语言的: argc-1) $* 所有位置参数的内容 $? 返回值 $$ 当前进程号 $! 最后一个!!!
位置变量 : $1 ~ $9
- 自定义变量: 赋值使用等号 ( =的前后不能有空格)
特殊字符
双引号 ” “
由双引号括起来的字符,除$、、’、和”这几个字符仍是特殊字符并保留其特殊功能外,其余字符仍作为普通字符对待。对于$来说,就是用其后指定的变量的值来代替这个变量和$;对于转义字符,它告诉shell不要对其后面的那个字符进行特殊处理,只当作普通字符即可。可以想见,在双引号中需要在前面加上的只有四个字符$,,’和”本身。
单引号 ’ ‘
由单引号括起来的字符都作为普通字符出现。特殊字符用单引号括起来以后,也会失去原有意义,而只作为普通字符解释。
反引号 ` `
反引号(`)这个字符所对应的键一般位于键盘的左上角,不要将其同单引号(’)混淆。反引号括起来的字符串被shell解释为命令行,在执行时,shell首先执行该命令行,并以它的标准输出结果取代整个反引号(包括两个反引号)部分。例如:
$ pwd
/home/xyz
$ string=”current directory is `pwd`”
$ echo $string
current directour is /home/xyz
竖 杠 |
1、把一条命令的输出重定向为另一命令的输入 cmd1 | cmd2
。
假设ls得到的当前目录下的结果为:
$ls
$shell_test11.sh shell_test1.sh shell_test2.sh
则使用cmd2 使用 grep有:
$ls | grep "1"
shell_test11.sh
shell_test1.sh
2、作为参数传给cmd2,需要在 | 后面添加 xargs ;例如cmd1 | xagrs cmd2
,这样会将cmd1所得到的结果作为参数传给cmd2
假设当前目录下有shell_test11.sh shell_test1.sh shell_test2.sh三个文件,分别存放了abc ijk xyz。执行以下命令
$ls | xargs grep "abc"
shell_test1.sh:abc
重定向符 < > >>
> (file) 输出重定向到文件
>> (file) 输出重定向到文件,内容加到已存在的文件尾部
< (file) 输入重定向到文件
通配符
*
代表任何字符串(长度可以不等)
但应注意,文件名前的圆点(.)和路经名中的斜线(/)必须显式匹配。例如“”不能匹配.file,而“.”才可以匹配.file。?
代表任何单个字符[]
代表指定的一个字符范围,只要文件名中[]位置处的字符在[]中指定的范围之内,那么这个文件名就与这个模式串匹配。。方括号中的字符范围可以由直接给出的字符组成,也可以由表示限定范围的起始字符、终止字符及中间的连字符(-)组成。
例如,f [a- d] 与f [abcd]的作用相同。
正则表达式
元字符
元字符 | 含义 | 示例 | 说明 |
---|---|---|---|
. | 匹配一个除换行符以外的任意字符 | a.b | 配以a开头b结尾,中间有一个任意字符的单词 |
^ | 匹配行首 | ^ab | 匹配以ab为行首的单词 |
$ | 匹配行尾 | $1 | 匹配以ab为行尾的单词 |
\ | 转义符 | \< | 转换<原本的含义 |
\| | 逻辑或 | ab\|AB | 匹配ab或者AB |
\< \> | 匹配一个指定的单词 | \< ab\> | 精准匹配ab这个单词 |
范围
范围 | 含义 | 示例 | 说明 |
---|---|---|---|
[ ] | 匹配一个指定范围的字符 | a[xyz]b | 匹配以a开头b结尾,中间有一个x或y或z的单词 |
[^] | 匹配一个不在指定范围的字符 | a[^xyz]b | 匹配以a开头b结尾,中间有一个不是x或y或z的字符的单词 |
重复
重复 | 含义 (尽量多地) | 示例 | 说明 |
---|---|---|---|
? | 使前面的字符重复0次或1次 | a? | 匹配a重复了0次或1次的单词 |
* | 使前面的字符重复0次或多次 | a* | 匹配a重复了0次或多次的单词 |
+ | 使前面的字符重复1次或多次 | a+ | 匹配a重复了1次或多次的单词 |
{n} | 使前面的字符重复n次 | a{6} | 匹配a重复了6次的单词 |
{n,} | 使前面的字符重复n次或以上 | a{6,} | 匹配a重复了6次或以上的单词 |
{n,m} | 使前面的字符重复n次到m次 | a{6,9} | 匹配a重复了6次到9次的单词 |
重复 | 含义 (尽量少地) | 示例 | 说明 |
---|---|---|---|
?? | 使前面的字符重复0次或1次 | a? | 匹配a重复了0次或1次的单词 |
*? | 使前面的字符重复0次或多次 | a* | 匹配a重复了0次或多次的单词 |
+? | 使前面的字符重复1次或多次 | a+ | 匹配a重复了1次或多次的单词 |
{n}? | 使前面的字符重复n次 | a{6} | 匹配a重复了6次的单词 |
{n,}? | 使前面的字符重复n次或以上 | a{6,} | 匹配a重复了6次或以上的单词 |
{n,m}? | 使前面的字符重复n次到m次 | a{6,9} | 匹配a重复了6次到9次的单词 |