Linux 的shell编程入门(一)

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次的单词
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值