shell脚本入门


Shell简介

Shell,英文是壳,外壳的意思,至于在计算机中,同样有这样的一层意思,也就是可以将shell看做是计算机系统封装的一层外壳,来供用户使用.(个人理解就是shell相当于沟通内核和外部命令的中间媒介,由于内核和外部命令不能直接沟通,因此有必要存在这样一种媒介)因此,用户可以通过操纵shell也就是输入一系列命令来达到各种需要的目的。Shell的作用是解释执行用户的命令,用户输入⼀条命令,Shell就解释执⾏一条,这种方式称为交互式(Interactive),Shell还有一种执行命令的方式称为批处理(Batch),用户事先写一 个Shell脚本(Script),其中有很多条命令,让Shell一次把这些命令执行完,而不必一条一条地敲命令。Shell脚本和编程语言很相似,也有变量和流程控制语句,但Shell脚本是解释执行的,不需要编译,Shell程序从脚本中一行一行读取并执行这些命令,相当于一个用户把脚本中的命令一行一 行敲到Shell提示符下执行。

由于历史原因,UNIX系统上有很多种Shell:

我们可以通过命令cat /etc/shells查看系统中所有已知(不一定已安装)的Shell变种。echo $SHELL显示出当前shell类型
shell类型
很明显当前为bash—bash(Bourne Again Shell):由GNU开发的Shell,主要目标是与POSIX标准保持⼀一致,同时兼顾对sh的兼容,bash从csh和ksh借鉴了很多功能,是各种Linux发行版标准配置的Shell,在Linux系统上/bin/sh往往是指向/bin/bash的符号链接。虽然如此,bash和sh还是有很多不同的,一方面,bash扩展了一些命令和参数,另一方面,bash并不完全和sh兼容,有些行为并不一致,所以bash需要模拟sh的行为:当我们通过sh这个程序名启动bash时,bash可以 假装⾃自⼰己是sh,不认扩展的命令,并且⾏行为与sh保持⼀一致。

Shell执行脚本

shell脚本
上面即为简单的shell脚本,Shell脚本中用#表示注释,相当于C语言的//注释。但如果#位于第一行开头,则例外。它表示该脚本使用后面指定的解释器/bin/sh解释执行。(#!—shellbang)
shell脚本执行方式

  1. chmod u+x file.sh
  2. /bin/bash file.sh
    下图很清楚表示上面的两种方法。
    这里写图片描述

shell执行过程的理解

shell用fork建立新进程,用exex在新进程中运行用户指定的程序,最后shell用wait命令等待新进程结束。wait系统调用同时从内核取得退出状态或者信号序号以告知子进程是如何结束的。
下面用图来说明这个过程,如图:
这里写图片描述

Shell变量

按照惯例,Shell变量由全⼤大写字母加下划线组成,有两种类型的Shell变量:
环境变量
环境变量可以从父进程传给子进程,因此Shell进程的环境变量可以从当前Shell进程传给fork出来的子进程。用printenv命令可以显⽰示当前Shell进程的环境 变量。这里写图片描述
本地变量
只存在于当前Shell进程,用set命令可以显⽰示当前Shell进程中定义的所有变量(包括本地变 量和环境变量)和函数。环境变量是任何进程都有的概念,而本地变量是Shell特有的概念。

变量引用

如果一个变量叫做 ${varname}可以表示它的值,在不引起歧义的情况下, $varname也可以表示它的值。注意,在定义变量时不用$,取变量值时要用$。和C语⾔言不同是,Shell变量不需要明确定义类型,事实上Shell变量的值都是字符串,比如我们定义VAR=45,其实VAR的值是字符串45而非整数。Shell变量不需要先定义后使用,如果对一个没有定义的变量取值,则值为空字符串。

文件名代换

文件名代换其实就是使用通配符来达到某一个位置的字符可以随意匹配,来达到查询结果的。
通配符 * : 匹配0个或多个任意字符
通配符? : 匹配⼀一个任意字符
通配符[若干字符] : 匹配方括号中任意⼀一个字符的一次出现

命令代换

反引号 “和$()

!/bin/bash
echo `pwd`
echo $(pwd)

结果
但二者也有不同

VAL=10 
echo `echo \$VAL`
echo $(echo \$VAL)

这里写图片描述

算术代换:(()),(())中的Shell变量取值将转换成整数,例如:
$ VAR=45
$ echo ((VAR+3))
$(())中只能⽤用+-*/和()运算符,并且只能做整数运算。

转义字符

和C语⾔言类似,\在Shell中被⽤用作转义字符,用于去除紧跟其后的单个字符的特殊意义(回车除外),换句话说,紧跟其后的字符取字面值。例如:
创建⼀一个文件名为$ $(中间有空格)的文件可以这样:
这里写图片描述
还有一个字符虽然不具有特殊含义,但是要用它做文件名也很麻烦,就是”-“号。如果要创建一个文件名以-号开头的文件,这样是不行的: 即使加上\转义也还是报错: 因为各种UNIX命令都把-号开头的命令⾏行参数当作命令的选项,而不会当作文件名。如果非要处理以-号开头的文件名,可以如下:
这里写图片描述
\还有⼀一种⽤用法,在\后敲回车表示续行,Shell并不会立刻执行命令,⽽而是把光标移到下一行,给出一个续行提示符>,等待用户继续输入,最后把所有的续行接到一起当作一个命令执行。例如:
这里写图片描述

单引号—双引号

和C语言不一样,Shell脚本中的单引号和双引号一样都是字符串的界符而不是字符的界定符。单引号用于保持引号内所有字符的字面值,即使引号内的\和回车也不例外, 但是字符串中不能出现单引号。$加变量名可以取变量的值反引号仍表⽰示命令替换
$表示$的字面值
`表示`的字面值
“表示”的字面值
\表示\的字面值 除以上情况之外,在其它字符前面的\无特殊含义,只表示字面值:

#!/bin/bash
  2 var=3
  3 echo 'hello\ $var'
  4 echo "hello\ $var"

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值