什么是shell
shell是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务。Ken Thompson的sh是第一种Unix Shell,Windows Explorer是一个典型的图形界面Shell。
shell是一个在操作系统之上的软件,Linux登录后默认进入这个软件.
shell是一个命令的解释器.
shell拥有自己内建的命令集
什么是bash
bash是shell的扩展,并且完全兼容shell(类似vi与vim的关系)
什么是shell script
shell脚本(shell script),是一种为shell编写的脚本程序。业界所说的shell通常都是指shell脚本,但读者朋友要知道,shell和shell script是两个不同的概念。由于习惯的原因,简洁起见,本文出现的“shell编程”都是指shell脚本编程,不是指开发shell自身(如Windows Explorer扩展开发)。
执行脚本
运行Shell脚本有两种方法:
作为可执行程序
chmod +x test.sh
./test.sh
注意,一定要写成./test.sh,而不是test.sh,运行其它二进制的程序也一样,直接写test.sh,linux系统会去PATH里寻找有没有叫test.sh的,而只有/bin, /sbin, /usr/bin,/usr/sbin等在PATH里,你的当前目录通常不在PATH里,所以写成test.sh是会找不到命令的,要用./test.sh告诉系统说,就在当前目录找。
作为解释器参数
这种运行方式是,直接运行解释器,其参数就是shell脚本的文件名,如:
sh test.sh
bash test.sh
变量
定义变量
变量以字母或者下划线开头,后面接任意长度的字母、数字和下划线,如 var=linux
如果变量的值中间有空格,需要用双引号引起来,如var="hello world"
定义变量时,变量名不加美元符号($),如:
your_name="qinjx" your_name='qinjx' your_name=qinjx
注意!!!变量赋值时两边不能有空格!!!
变量的引用
变量的引用需要在前面加$符号 ,如:
echo $var echo "$var"
单引号与双引号的区别
单引号里的变量不解析
双引号里的变量会解析成对应的值
name1="qinjx1" name4="hello $name1" # 输出:hello qinjx1 (解析) name5='hello $name1' # 输出:hello $name1 (不解析)
特殊变量
$n 代表第n个参数 $* 代表所有参数 $# 代表参数的个数 $? 代表上一个命令的返回状态(0表示成功,非0不成功)
命令替换
命令替换有两种方式:
echo $(id)
echo `id`
在执行命令的时候,会先将$()或者``里的命令先执行一遍
命令替换和管道的区别
命令替换是讲一个命令的输出作为另外一个命令的参数
管道是将命令的输出作为下一个命令的标准输入
算数运算和赋值
赋值
((i=1+1))
let j=2+2
y=$(($i+$j))
使用
echo $i $j $y
命令分隔符
分号(;)是shell的命令分隔符, 让同一行的命令能够顺序执行。如echo 1 ;echo 2
其他分隔符
[command1] && [command2]
[command1] || [command2]
&&左边的命令(命令1)返回真(即返回0,成功被执行)后,&&右边的命令(命令2)才能够被执行
||则与&&相反。如果||左边的命令未执行成功,那么||右边的命令就会执行
if语句
if基本语法
if [ 表达式 ];then [具体逻辑];fi
if command;then [具体逻辑];fi
表达式必须用[]括起来,另外[]里外都需要空格与周围隔开(例如: [ a == b ] ),否则会报错
条件测试类型
整数测试
-eq 测试两个整数是否相等 -ne 测试两个整数是否不等 -gt 测试一个数是否大于另一个数 -lt 测试一个数是否小于另一个数 -ge 大于或等于 -le 小于或等于
字符串测试
== 等于 != 不等 > 大于 < 小于 -z string 测试指定字符是否为空,空着真,非空为假 -n string 测试指定字符串是否为不空,空为假 非空为真
文件测试
(两边要有空格)
-e file 测试文件是否存在 -f file 测试文件是否为普通文件 -d file 测试指定路径是否为目录 -r file 测试文件对当前用户是否可读 -w file 测试文件对当前用户是否可写 -x file 测试文件对当前用户是都可执行
组合测试
-a: and -o: or !: 非
for循环
for arg in [list] do [command] done
while循环
while [command/condition] do [command] done
函数
定义函数
function name(){
[command]
}
调用
name
shell函数可以带function关键字,也可以不带
shell函数内可以加return返回值,也可以不带,如果不带就以最后一条命令运行结果,作为返回值.