一、什么是shell
shell既是一个可执行程序,又是一种程序设计语言。作为执行程序,它交互式地解释和执行用户输入的命令,是用户和Unix/Linux沟通的桥梁;作为程序设计语言,它可以定义变量和参数,在一定程度具备编程的能力。虽然不属于系统内核的一部分,但它调用了系统核心的大部分功能来执行程序、建立文件并以并行的方式协调各个程序的运行。因此,对于用户来说,shell是最重要的实用程序。
二、shell类型
三、shell脚本在编程程序语言中的分类
bash中的弱类型相对于强类型变量带来三个改变
1、变量无需声明
2、声明和赋值可同时进行
3、变量需要引用$
对于字符串赋值而言,因为bash中变量无需声明,所以直接赋值即可,c则需要声明。bash胜
对于数值计算而言,都需要赋值,只不过bash可以赋值声明和赋值可同时进行。胜bash一点点。
int a intb int c c=a+b print c
declare -i c
declare -i a
declare -i b
c=a+b echo $c 或者 c=$[a+b]
只不过通常写为c=$[$a+$b] 以便识别其他字符串变量引用。变量引用这或许是弱类型语言的又一弱点。
但bash对数值的计算程度的支持远不及c
[email protected] /tmp]#a=1 [[email protected] /tmp]#b=2 [[email protected] /tmp]#c=$a+$b [[email protected] /tmp]#echo $c 1+2 [[email protected] /tmp]#declare -i a=1 [[email protected] /tmp]#declare -i b=2 [[email protected] /tmp]#c=$a+$b [[email protected] /tmp]#echo $c 1+2 [[email protected] /tmp]#declare -i c [[email protected] /tmp]#c=$a+$b [[email protected] /tmp]#echo $c 3 ----------------------c不转换数值型,无法识别1+2
面向过程 面向对象
面向过程式编程语言
过程式:以指令为中心来组织代码,数据服务于代码
编译型语言 解释性语言
解释执行,并不像java、c那样生成.class文件再进行编译
四、shell脚本的特点及应用
特点:虽然shell编程不像Java那样强大,但是它们能够轻易的处理文件目录之类的对象,例如:打印一个字符串只需要一个echo即可,而不需要像java那样需要定义类和对象之类的框架结构。这也正弥补了解释型语言在速度上的缺陷。
shell脚本的用途有:
自动化常用命令
执行系统管理和故障排除
创建简单的应用程序
处理文本或文件
五、shell脚本的语法格式和执行条件
语法格式
第一行必须声明默解释环境(Shabang机制):#!/bin/bash,那么它执行时会默认用当前Shell去解释这个脚本(即:$SHELL环境变量)
执行方式:
作为可执行程序运行(给予执行权限,在命令行上指定脚本的执行路径)
注:任何一个可执行程序,如果要执行,必须在PATH环境变量中,以保证根可以找到程序,否则无法执行
作为指定特定解释器的参数运行
六、shell脚本中的语法基础
变量
这里当然不是说字符串、整型什么的,其实 bash 中的变量都可以理解为字符串。bash 中有四种类型的变量,它们是环境变量、本地变量、位置变量和特殊变量。
本地变量
环境变量 PATH PWD HOSTNAME HISTORY
定义方法:export VALUE
declare -x VALUE
局部变量
位置变量 $1,$2
特殊变量 $# $* [email protected] $? $0
运算
算术运算
let a=$b+$c
let a+=1
a=$[$a+$b]
逻辑运算
&& || !
注意:如果多条命令出现在逻辑关系中,建议加小括号
条件测试
字符串测试
~= :一般使用[[ ]]匹配模式
==
>
<
!= :以上比较的都是字符串对应的ASCII码的大小
-z : 字符串是否为空,空为真
-n :
数值测试
-eq
-ne
-gt
-ge
-lt
-le
文件测试
-e:文件是否存在
-f:是否存在且为普通文件
-s:文件是否为空
注意,测试要加[ ]
组合测试
-a -o -!
[ ! -r /tmp/file1 -a ! -w /tmp/file1 ]
注意:对于字符串测试和数值测试同样适用于此种格式
1、如果要使用globbing或者正则表达式要使用[[ ]],一般使用在字符串的~=中。
2、找不到错误时可以更换[]或者[[]]
注意 :组合测试中的-a ,-o,!一般用在测试条件间的逻辑,而逻辑运算中的&&,|| 一般用在命令执行结果中的判断
命令引用
$() ``
变量替换
$VALUE
[[email protected] ~]#a=1 [[email protected] ~]#b=2 [[email protected] ~]#ab=3 [[email protected] ~]#echo $ab 3 [[email protected] ~]#echo ${a}b 1b [[email protected] ~]#