1、 什么是shell?
shell是一个命令解释器,将用户输入的命令解释给操作系统内核。
Shell既是一种命令语言,又是一种程序设计语言。作为命令语言,它类似于Windows下的cmd.exe,可以交互式地解释和执行用户输入的命令;作为程序设计语言,它定义了各种变量和参数,并提供了许多在高级语言中才具有的控制结构,但是Shell是不需要进行编译的,它是从脚本程序中一行一行的读取并执行命令。
Shell有两种执行命令的方式:交互式(Interactive),用户输入一条命令,Shell就解释执行一条;批处理(Batch),用户事先写一个Shell脚本(Script),其中有很多条命令,让Shell一次把这些命令执行完,而不必一条一条地敲命令。
2 、常见的shell类型
Linux 的 Shell 种类众多,常见的有:
(1) BourneShell(sh):是由AT&T Bell实验室的 Steven Bourne为AT&T的Unix开发的,它是Unix的默认Shell,也是其它Shell的开发基础。Bourne Shell在编程方面相当优秀,但在处理与用户的交互方面不如其它几种Shell。
(2) BourneAgain Shell (即bash):是自由软件基金会(GNU)开发的一个Shell,它是Linux系统中一个默认的Shell。Bash不但与Bourne Shell兼容,还继承了C Shell、Korn Shell等优点。
(3) ash:ash Shell是由Kenneth Almquist编写的,是Linux 中占用系统资源最少的一个小Shell,它只包含24个内部命令,因而使用起来很不方便。
(4) CShell(csh):是加州伯克利大学的Bill Joy为BSD Unix开发的,共有52个内部命令,与sh不同,它的语法与C语言很相似。它提供了Bourne Shell所不能处理的用户交互特征,如命令补全、命令别名、历史命令替换等。但是,C Shell与BourneShell并不兼容。该Shell其实是指向/bin/tcsh这样的一个Shell,也就是说,csh其实就是tcsh。
(5) KornShell(ksh):是AT&T Bell实验室的David Korn开发的,共有42 条内部命令,它集合了C Shell和Bourne Shell的优点,并且与Bourne Shell向下完全兼容。Korn Shell的效率很高,其命令交互界面和编程交互界面都很好。
(6) zch:是Linux 最大的Shell之一,由Paul Falstad完成,共有84 个内部命令。如果只是一般的用途,没有必要安装这样的Shell。
可以使用系统变量SHELL查看当前使用的shell:echo $SHELL
也可以到/etc/shells文件里查看系统可以使用的shell
3、 shell的交互方式
- 命令行
- 脚本执行
- 编写脚本,文件后缀名一般为.sh
- 文件必须以#!/bin/bash开头
- 添加脚本的可执行权限chmode +x 脚本名
- 执行脚本:
-
在当前目录里执行:./脚本名
-
在其他目录中执行:使用绝对路径
#!/bin/bash
#使用#注释,第一行是特殊存在
cd /
ls -al:wq #存退出盘
chmod +x 1.sh #修改权限,添加可执行权限
./1.sh #执行当前目录下的shell脚本
-
4、 定义变量
-
变量类型
- 局部变量:只在本shell中使用
- 环境变量 : 使用整个系统,一般大写
-
局部变量的使用
#1 定义局部变量
a=10 #注意等号两边不要留空格,否则会看成多个命令
b=$a#2显示局部变量
echo {b}
echo "a=$a" #双引号中的变量解释#3.销毁变量
unset a #干掉一个变量,不要带$符
#注意反引号,反引号引起来的是命令,可以执行,将执行结果给变量
d=`date`【注】:等号两边不要留空格
-
位置变量
$0 表示脚本的名称
$1-$9表示传递给脚本的的参数#test.sh脚本
#!/bin/bash
echo 'hello world'
echo $0 $1 $2执行输出:
hello world
./test.sh lala dudu -
特殊变量
$#表示传递给脚本的参数个数
$*表示传递给脚本的所有参数
$?表示上一个命令执行的返回值,返回值为0表示成功执行,否则命令执行错误 -
常量
readonly a=10 #定义常量
echo $a
a='ll' #-bash: name: 只读变量,不能修改
5 引号
- 双引号中解释变量,解释转义字符
- 单引号不解释变量、不解释转义字符
- 反引号会执行当中的内容
- 特殊字符要用反斜线转义:& * ?| $ ^
6 字符串
- 计算字符串长度${#字符串名}
- 提取子串:${字符串名:start:len}从下标为start开始,提取len个字符
7 数组
- 数组定义:a=(1 2 3) #千万注意,数值之间用空格分隔
- 获取数组元素:${a[0]}
- 赋值$a[0]=100
- 获取数组长度:{#a[@]}或者{#a[*]}
8 seq
- 生成连续整数
- 示例:seq 1 10,生成1-10的连续整数
9 运算
-
数学运算
shell默认所有变量都是字符串,执行数学计算需要用[]括起来
a=100
echo $[$a+10]
echo $[$a/2]
echo $[$a*2]
echo $[$a-80]
echo $[10%2]
echo $((3+5))
echo $((10/2))
echo $((10/3)) # 整除
echo $((10*3))
echo $((10%3))
let a=5+6
echo $a
let a+=10
echo $a
echo `expr 3 + 5` #也可以用expr进行计算
- 关系运算
运算符 | 说明 | 举例 |
---|---|---|
-eq | ==,相等返回 true。 | [ a -eq b ] |
-ne | !=,不相等返回 true。 | [ a -ne b ] |
-gt | >,如果是,则返回 true。 | [ a -gt b ] |
-lt | <,如果是,则返回 true。 | [ a -lt b ] |
-ge | >=,如果是,则返回 true。 | [ a -ge b ] |
-le | <=,如果是,则返回 true。 | [ a -le b ] |
- 逻辑运算
运算符 | 说明 | 举例 |
---|---|---|
&& | 逻辑的 AND | [[ a -lt 100 && b -gt 100 ]] 返回 false |
|| | 逻辑的 OR | [[ a -lt 100 || b -gt 100 ]] 返回 true |
- 字符串判断
运算符 | 说明 | 举例 |
---|---|---|
= | 检测两个字符串是否相等,相等返回 true。 | [ a = b ] 返回 false。 |
!= | 检测两个字符串是否相等,不相等返回 true。 | [ a != b ] 返回 true。 |
-z | 检测字符串长度是否为0,为0返回 true。 | [ -z $a ] 返回 false。 |
str | 检测字符串是否为空,不为空返回 true。 | [ $a ] 返回 true。 |
- 文件判断
操作符 | 说明 | 举例 |
---|---|---|
-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。 |
10 分支语句
- if-else
a=100
if [ $a -gt 90 ]
then
echo "a>90"
else
echo "a<=90"
fi
- case
case $变量名 in
模式1)
命令序列1
;;
模式2)
命令序列2
;;
*)
默认执行的命令序列
;;
esac
1 #!/bin/bash
2 case $1 in
3 start | begin)
4 echo "start"
5 ;;
6 stop | end)
7 echo "stop"
8 ;;
9 *)
10 echo "I don't know"
11 esac
11 循环语句
-forin
for 变量 in 列表
do
command1
command2
...
commandN
done
示例:
for i in 1 2 3 4 5;do
echo $i
done
#从命令读取值
for line in `cat 1.txt`;do
echo $line
done
#读取目录列表
for file in ~/*;do
echo $file;
done
for i in `seq 1 100`;do
let sum+=$i
done
#遍历数组
for x in ${a[*]};do
echo $x;
done
- while
#当型循环
while condition
do
command
done
sum=0
i=0
while [ $i -lt 10];do
let sum+=$i
let i+=1
done
- until
#直到型循环
#condition为假执行循环,为真停止
until condition
do
command
done
until [ ! $i -lt 10 ];do
echo $i;
let i+=1;
done
12 break和continue
break 退出当前循环
continue 结束当次循环
13 函数
- 函数必须先定义后使用
#函数定义
test()
{
echo "简单函数"
}
#函数调用
test()
网友评论