Linux 的shell编程入门(一)

shell简介

什么是shell

什么是shell?简单说shell是用户和操作系统之间的接口
Shell本身是一种用C语言编写的程序,从用户的角度来看,Shell是用户与Linux操作系统沟通的桥梁。用户既可以输入命令执行,又可以利用 Shell脚本编程,完成更加复杂的操作。
Linux 的shell编程入门(一)_第1张图片

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次的单词

你可能感兴趣的:(shell编程)