1.什么是Shell
Shell本身是一个用C语言编写的程序,它是用户使用Unix/Linux的桥梁,用户的大部分工作都是通过Shell完成的。
Shell既是一种命令语言,又是一种程序设计语言。作为命令语言,它交互式地解释和执行用户输入的命令;作为程序设计语言,它定义了各种变量和参数,并提供了许多在高级语言中才具有的控制结构,包括循环和分支。 它虽然不是Unix/Linux系统内核的一部分,但它调用了系统核心的大部分功能来执行程序。深入了解和熟练掌握shell的特性极其使用方法,是用好Unix/Linux系统的关键。2.Shell执行命令有两种的方式
交互式(Interactive):解释执行用户的命令,用户输入一条命令,Shell就解释执行一条。
批处理(Batch):用户事先写一个Shell脚本(Script),其中有很多条命令,让Shell一次把这些命令执行完,而不必一条一条地敲命令。
3.几种常见的Shellsh
sh 由Steve Bourne开发,是Bourne Shell的缩写,sh 是Unix 标准默认的shell。 bash bash是Linux标准默认的shell,bash完全兼容sh,也就是说,用sh写的脚本可以不加修改的在bash中执行。 bash由Brian Fox和Chet Ramey共同完成,是 BourneAgain Shell的缩写,内部命令一共有40个。 ash/csh/ksh4.脚本语言与编译型语言的差异
编译型语言: 很多传统的程序设计语言,例如C、C++和Java,都是编译型语言。这类语言需要预先将我们写好的源代码(source code)转换成目标代码(object code),这个过程被称作“编译”。!
解释型语言: 解释型语言也被称作“脚本语言”。执行这类程序时,解释器(interpreter)需要读取我们编写的源代码(source code),并将其转换成目标代码(object code),再由计算机运行。因为每次执行程序都多了编译的过程,因此效率有所下降。 脚本编程语言的例子有Python、Ruby、Perl与Shell等。5.第一个Shell脚本--HelloWorld
打开文本编辑器,新建一个文件,扩展名为sh(sh代表shell)
输入一些代码:#!/bin/bashecho "Hello World !" “#!” 是一个约定的标记,它告诉系统这个脚本需要什么解释器来执行,即使用哪一种Shell。 echo命令用于向窗口输出文本。6.运行Shell脚本的两种方法
(1)作为可执行程序
将上面的代码保存为test.sh,并 cd 到相应目录: chmod +x ./test.sh #使脚本具有执行权限 ./test.sh #执行脚本(2)作为解释器参数
bin/bash test.sh 这种方式运行的脚本,不需要在第一行指定解释器信息,写了也没用7.shell中读取输入数据
#!/bin/bash
echo "What is your name?" read PERSON echo "Hello, $PERSON"8.Shell变量
定义变量:variableName="value"
注意:变量名和等号之间不能有空格使用变量
your_name="itcast" echo $your_name echo ${your_name}howareyou 变量名外面的花括号是可选的,加不加都行,加花括号是为了帮助解释器识别变量的边界删除变量
使用 unset 命令可以删除变量。语法: unset variable_name 例: myUrl="http://www.itcast.cn" unset myUrl echo $myUrl 只读变量 使用 readonly 命令可以将变量定义为只读变量,只读变量的值不能被改变。9.Shell特殊变量
变量 | 含义 |
$0 | 当前脚本的文件名 |
$n | 传递给脚本或函数的参数。n 是一个数字,表示第几个参数。例如,第一个参数是$1,第二个参数是$2。 |
$# | 传递给脚本或函数的参数个数。 |
$* | 传递给脚本或函数的所有参数。 |
$@ | 传递给脚本或函数的所有参数。被双引号(" ")包含时,与 $* 稍有不同,下面将会讲到。 |
$? | 上个命令的退出状态,或函数的返回值。 |
$$ | 当前Shell进程ID。对于 Shell 脚本,就是这些脚本所在的进程ID。 |
举例:
#!/bin/bash
echo "File Name: $0"echo "First Parameter : $1"echo "Second Parameter : $2"echo "Quoted Values: $@"echo "Quoted Values: $*"echo "Total Number of Parameters : $#"10.命令替换
命令替换是指Shell可以先执行命令,将输出结果暂时保
存,在适当的地方输出#!/bin/bashDATE=`date`(注意是“ ` ”,而不是引号,表示引用的linux系统命令)echo "Date is $DATE"USERS=`who | wc -l`echo "Logged in user are $USERS"UP=`date ; uptime`echo "Uptime is $UP"变量替换可以根据变量的状态(是否为空、是否定义等)来改变它
的值形式 | 说明 |
${var} | 变量本来的值 |
${var:-word} | 如果变量 var 为空或已被删除(unset),那么返回 word,但不改变 var 的值。 |
${var:=word} | 如果变量 var 为空或已被删除(unset),那么返回 word,并将 var 的值设置为 word。 |
${var:+word} | 如果变量 var 被定义,那么返回 word,但不改变 var 的值。 |
11. Shell运算符
Bash 支持很多运算符包括算数运算符、关系运算符、布尔运算符、字符串运算符和文件测试运算符。
原生bash不支持数学运算,但是可以通过其他命令来实现,例如 expr #!/bin/bashval=`expr 2 + 2`echo "Total value : $val"(1)算术运算符:运算符 | 说明 | 举例 |
+ | 加法 | `expr $a + $b` 结果为 30。 |
- | 减法 | `expr $a - $b` 结果为 10。 |
* | 乘法 | `expr $a \* $b` 结果为 200。 |
/ | 除法 | `expr $b / $a` 结果为 2。 |
% | 取余 | `expr $b % $a` 结果为 0。 |
= | 赋值 | a=$b 将把变量 b 的值赋给 a。 |
== | 相等。用于比较两个数字,相同则返回 true。 | [ $a == $b ] 返回 false。 |
!= | 不相等。用于比较两个数字,不相同则返回 true。 | [ $a != $b ] 返回 true。 |
(2)关系运算符:
运算符 | 说明 | 举例 |
-eq | 检测两个数是否相等,相等返回 true。 | [ $a -eq $b ] 返回 true。 |
-ne | 检测两个数是否相等,不相等返回 true。 | [ $a -ne $b ] 返回 true。 |
-gt | 检测左边的数是否大于右边的,如果是,则返回 true。 | [ $a -gt $b ] 返回 false。 |
-lt | 检测左边的数是否小于右边的,如果是,则返回 true。 | [ $a -lt $b ] 返回 true。 |
-ge | 检测左边的数是否大等于右边的,如果是,则返回 true。 | [ $a -ge $b ] 返回 false。 |
-le | 检测左边的数是否小于等 | [ $a -le $b ] 返回 true。 |
(3)布尔运算符:
运算符 | 说明 | 举例 |
! | 非运算,表达式为 true 则返回 false,否则返回 true | [ ! false ] 返回 true |
-o | 或运算,有一个表达式为 true 则返回 true | [ $a -lt 20 -o $b -gt 100 ] 返回 true |
-a | 与运算,两个表达式都为 true 才返回 true | [ $a& |
(4)字符串运算符:
运算符 | 说明 | 举例 |
= | 检测两个字符串是否相等,相等返回 true | [ $a = $b ] 返回 false |
!= | 检测两个字符串是否相等,不相等返回 true | [ $a != $b ] 返回 true |
-z | 检测字符串长度是否为0,为0返回 true | [ -z $a ] 返回 false |
str | 检测字符串是否为空,不为空返回 true | [ str $a ] 返回 true |
(5)文件测试运算符:
操作符 | 说明 | 举例 |
-d file | 检测文件是否是目录,如果是,则返回 true。 | [ -d $file ] 返回 false。 |
-f file | 检测文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回 true。 | [ -f $file ] 返回 true。 |
-r file | 检测文件是否可读,如果是,则返回 true。 | [ -r $file ] 返回 true。 |
-w file | 检测文件是否可写,如果是,则返回 true。 | [ -w $file ] 返回 true。 |
-x file | 检测文件是否可执行,如果是,则返回 true。 | [ -x $file ] 返回 true。 |
-s file | 检测文件是否为空(文件大小是否大于0),不为空返回 true。 | [ -s $file ] 返回 true。 |
-e file | 检测文件(包括目录)是否存在,如果是,则返回 true。 | [ -e $file ] 返回 true。 |
13.Shell字符串
字符串是shell编程中最常用最有用的数据类型
字符串可以用单引号,也可以用双引号,也可以不用引号字符串连在一起就能拼接获取字符串长度
string="abcd"echo ${#string} #输出 4提取子字符串string="alibaba is a great company"echo ${string:1:4} #输出liba查找子字符串string="alibaba is a great company"echo `expr index "$string" is`14.shell中的数组定义数组
在Shell中,用括号来表示数组,数组元素用“空格”符号分割开array_name=(value0 value1 value2 value3) 还可以单独定义数组的各个分量:array_name[0]=value0array_name[1]=value1array_name[2]=value2读取数组valuen=${array_name[2]}获取数组的长度length=${#array_name[@]} 或 length=${#array_name[*]}数组的遍历:for arr in ${array[*]}; do echo $arr; done15.Shell if else语句:
Shell 有三种 if ... else 语句:
if ... fi 语句;if ... else ... fi 语句;if ... elif ... else ... fi 语句。例:if [ $a == $b ]then echo "a is equal to b"fi16.Shell for循环
for循环一般格式为:
for 变量 in 列表do command1 command2 ... commandNdone17.Shell while循环
语法示例:
COUNTER=0while [ $COUNTER -lt 5 ]do COUNTER='expr $COUNTER + 1 ' echo $COUNTERdonewhile循环可用于读取键盘信息
while read FILMdo echo "Yeah! great film the $FILM"done18.Shell函数
函数可以让我们将一个复杂功能划分成若干模块,让程序结构更加
清晰,代码重复利用率更高。Shell 函数的定义格式如下:function_name () { a=$1 b=$2 list of commands [ return value ]}function_name 10 20echo $?函数返回值,可以显式增加return语句;如果不加,会将最后一条命令运行结果作为返回值。Shell函数参数:
直接在调用函数名后传入参数
函数中获取参数用 $1, $2, ...19.Shell输入输出重定向
Unix 命令默认从标准输入设备(stdin)获取输入,将结果输出到标准输出设备(stdout)显示。一般情况下,标准输入设备就是键盘,标准输出设备就是终端,即显示器。
输出重定向命令的输出不仅可以是显示器,还可以很容易的转移到文件,这被称为输出重定向。 command > file输入重定向和输出重定向一样,Unix 命令也可以从文件获取输入,语法为:command < file一般情况下,每个 Unix/Linux 命令运行时都会打开三个文件:
标准输入文件(stdin):stdin的文件描述符为0,Unix程序默认从stdin读取数据。标准输出文件(stdout):stdout 的文件描述符为1,Unix程序默认向stdout输出数据。标准错误文件(stderr):stderr的文件描述符为2,Unix程序会向stderr流中写入错误信息。如果希望执行某个命令,但又不希望在屏幕上显示输出结果,那么可以将输出重定向到 /dev/null , /dev/null 是一个特殊的文件,写入到它的内容都会被丢弃; command > /dev/null如果希望将 stdout 和 stderr 合并后重定向到 file,可以这样写: command 1 > file 2>&120.Shell文件包含像其他语言一样,Shell 也可以包含外部脚本,将外部脚本的内容合并到当前脚本。
创建两个脚本,一个是被调用脚本 subscript.sh,内容如下:
url="一个是主文件 main.sh,内容如下:#!/bin/bash. ./subscript.shecho $url