Shell基础知识
一、本文的目标
该文主要内容是整理自本人在这段时间学习Linux Shell脚本的学习笔记,主要涉及的内容是:对 Shell 的认识、基本的编程语法内容、正则表达式、Linux中精巧的过滤器swk和sed的使用简介,通过一些实例程序的编写分析来加强理解和记忆。目标是:方便以后自温习这部分的内容,也希望对和我一样的新手有所帮助。新手学习交流,能者多多指教。
二、关于 Shell
(1)Shell 是什么?
我们通常所说的 Shell脚本编程指的是Linux下的“命令行式的Shell”,“Shell”英文解析是“壳、外壳”的意思,在计算机界是指和用户/使用者直接交互的软件,其实是把用户的“语言”解析成操作系统可以理解的“语言”,或者把操作系统的信息解析成用户可以理解信息。比如windows下的图形界面,叫GUI Shell,Linux下的命令行交互软件,即 Linux Shell,这也是本文要学习的对象。到此,对Shell有了个初步的概念,Shell是操作系统的一个外壳软件,他负责与用户直接交互。
(2)Shell 脚本在 Linux 中起什么作用?
在很久很久以前,也不是很久^_^,那时Linux还没有桌面窗口,要使用 Linux 就需要往终端中一行一行地敲入指令来让Linux完成一些工作任务,因此也把这些操作Linux的指令叫做Shell指令,停,先补充一个概念,脚本:百度百科中解释是“一种特定的描述性语言,依据一定的格式编写的可执行文件”,这就好办了,如果我需要在Linux中完成一个任务,需要一连串的指令来完成,把这些一连串的指令按照“约定规则”写在一个文件中,赋予执行权限,哦,这文件就叫Shell脚本。方便性和代码的重用性可想而知。
“约定的规则”即是说Shell脚本的语法规则,和其他编程语言一样有自己的一套语法,但是,Shell是一种解析型语言,不需要编译就可以运行,而C/C++需要经过编译才能运行目标文件。
(3)Linux Shell 的种类?
Linux Shell的种类是指Shell解析器的种类,常见的有sh、bash、ksh、csh等等。sh是UNIX上最初的Shell,在每种UNIX系统中都可以使用,而bash是sh扩展版,通常是用在PC平台的Linux OS中,他比sh要强大得多,但是在嵌入式Linux OS中不支持,因此,如果编写的Shell脚本要在Embeded Linux OS中运行最好使用sh版本的Shell脚本。这两种脚本在Linux中是最常用的,其他的就不一一介绍了。
(4)学什么?要如何来学习 Shell 编程?
主要学习 Shell 脚本语言的语法结构,比如:脚本的格式、变量定义和使用、一些约定的特殊符号、字符串的处理、分支结构、循环结构、正则表达式,还有一个前提就是熟悉Linux的常用的工具/指令(比如常见用的echo、find、grep、wc、swk、sed、ls、cat等等)。目前我是通过边熟悉基本语法、Linux指令,边编写Shell脚本来学习,学习了一个规则原理就编写一个对应的例子来验证,更好的办法还在摸索当中,不过我想再好的方法都离不开“知行合一”。 ^_^
三、初级入门笔记整理
(1)编写Shell脚本的格式
在第一行指定Shell脚本解析器:
#!/bin/bash 或:
#!/bin/sh 或其他,往后就可以开始编写Shell命令了。
(2)变量的定义和引用规则
Shell变量是一种弱类型的变量,即定义时无需声明变量的类型,默认一切皆“字符串”,在需要将其用作整数的时候,通过特殊的运算符即可完成,这点后边再分析。
①变量的定义规则:首个字符必须为字母,可以使用下划线,不可以使用其他标点符号,注意:“=”两边不能有空格!
myvalue="abcdefg"
一定需要双引号?当然不是。如果赋给变量的值是多个单词,即中间有空格隔开,就必须要使用双引号来表明他们是一个整体。
myvalue="hello world"
myvalue=hello_world
多个单词的时候使用单引号可不可以?完全可以,前提是,单引号里边字符全都当做普通字符,没有任何其他功能含义,稍后分析单引号和双引号在变量定义中使用的区别。
myvalue='hello world'
②变量的引用:$变量名
$myvalue
③Shell中变量的种类:
- 用户自定义:像上边的 myvalue 变量。
- 系统环境变量:像Linux系统中经常接触到的 PATH 变量,这类变量可以在命令行终端输入“env”指令来查看当前的系统环境变量有哪些变量值是多少。
- 命令行变量:即在执行脚本的时候传进去的变量
$* 和 $@ :表示所有的变量,以空格隔开。 $n :n从1开始,表示传入的第几个参数变量。 $# :参数的个数。
- 特殊变量:
$? :在使用该变量处的上一条命令执行的结果(返回值)。 $$ :执行当前Shell脚本的进程号。
(3)Shell的特殊符号
- 三种引号:下边所说的用法功能是指用在变量的定义赋值时。
单引号:所包含的范围皆为字符串。
例子:
value1="hello" value2='$value1 world.`date`' echo $value2
运行结果:$value1 world.`date`
双引号:引号范围内可以引用变量,或执行命令。
例子:
value1="hello" value2='$value1 world.`date`' echo $value2
抑音符/重音符:Esc键下边的那个,用在双引号里边表示一个Shell命令。 - 管道“|”:功能强大,用法多多。
实现:将左边一条指令运行的结果作为右边指令的输入。 - 重定向符“>”“<”
主要记住:标准的3个设备文件:“0”标准输入;“1”标准输出;“2”标准出错,在理解记忆下边这几个典型的例子:
ls 1> my.txt # ls 的内容就会全部写入到my.txt文件中
ls hdhd.abc 1> my.txt # ls 执行失败的信息就会全部写入到my.txt文件中
注意:当标准设备文件放在重定向符右边时需要加“&”符号
echo "hello" 1>&2 # 即把echo的标准输出重定向到他的标准出错。
(4)字符串处理
(5)分支结构
(6)循环结构