1、什么是Shell
- 壳(界面)和核(内核) c语言编写的接口(界面),用户通过shell接口调用内核服务,shell可以实现对用户命令的解释和执行
a)分为两类:图形界面(GUI:gnome,kde)/命令行界面(cli,bash,sh等)
b)交互式shell/不交互式shell
c)常见shell(/etc/shells):unix下默认是sh,linux下默认是bash - shell是一门语言(解释性语言),一方面是命令语言;另一方面是程序设计语言,可以有流程控制,变量等。
2、shell语言基本使用
- 1)如何书写shell脚本
#!/bin/bash
# 默认解释器(程序)类型,如果指定解释器,该行不生效
echo "aa"
- 2)执行
A 确定解释器执行
sh脚本/bash脚本
B 内部命令
./sourcre : bash内部命令
作用: 使Shell读入指定的Shell程序文件并依次执行文件中的所有语句
C 直接执行文件(确保文件有执行权限)
绝对路径/相对路径(./文件) - 3)注释
#:代表单行注释
:<<! 注释
! :多行注释
3.shell语法
1)变量
A、内置变量
查看变量: set
输出某个变量: echo
P
W
D
/
PWD/
PWD/PATH/#SHELL
B、自定义变量
基本语法:变量名=变量值
说明:
-
1.变量两侧不能有空格
-
2.值中有空格需要使用引号
-
3.双引号可以直接引用变量,但是单引号会脱意。
-
4.获取变量值可以使用${变量名}
-
其他使用:
只读变量: readonly 变量名=变量值
删除变量:unset 变量名
案例总结:
a.sh
#!/bin/bash
A="A in a.sh"
echo $A
. /root/b.sh
echo $B
b.sh
#!/bin/bash
B="B in b.sh"
echo $B
echo $A
总结:
1、a.sh中直接调用b.sh,会让b.sh在A所在的bash进程的“子进程”空间中执行
2、而子进程空间只能访问父进程中用export定义的变量
3、一个shell进程无法将自己定义的变量提升到父进程空间中去
4、source或者“.”号执行脚本时,会让脚本在调用者所在的shell进程空间中执行
C 方引号赋值
先将结果运算完毕,然后赋值
A=date
/ A=
(
d
a
t
e
)
e
c
h
o
−
e
"
(date) echo -e "
(date)echo−e"B"
D 特殊变量
$?:上一次状态码
$$:进程编号
$0:脚本名称
$n:从1开始,参数信息
$#:参数个数
$*/$@:参数列表
4、运算符
1)算术运算符
A.expr运算
B=`expr m + n`
注意:
1.符号两侧必须有空格
2.乘号需要转义
B.(())运算
$((3+2))
C.$[]运算
D.let
[root@hdp1 ~]# let C=A+B
[root@hdp1 ~]# echo $C
25
[root@hdp1 ~]# let C++
[root@hdp1 ~]# echo $C
E. bc命令
实现浮点数的运算
[root@hdp1 ~]# echo "10/3" | bc
3
[root@hdp1 ~]# echo "scale=2;10/3" | bc
3.33
[root@hdp1 ~]# echo "ibase=8;20" | bc
16
[root@hdp1 ~]# echo "ibase=10;obase=8;20" | bc
24
[root@hdp1 ~]# echo "4^4" | bc
256
[root@hdp1 ~]# echo "2.2>2" | bc
1
[root@hdp1 ~]# echo "2.2<2" | bc
0
2)三元运算
[ condition ] && 表达式1 || 表达式2
中括号两侧必须有空格
3)比较运算符
数值比较:
-eq /-gt /-lt/-ge/-le/-ne
4)逻辑运算符
!/-a/-o
5)字符串运算符
=/!=
6)文件运算符
-d/-f/-s
5、流程控制
- if
if [ condition ]
then 语句1
elif [ condition ]
then 语句2
else
语句3
- case
case 变量 in
值1)
语句1
;;
值2)
语句 2
;;
*)
语句3
esac
3)while
while []/(())
do
语句
done
i=1
SUM=0
while ((i<=100))
do
let SUM=SUM+i
let i++
done
echo $SUM
4)for
1.for 变量 in 参数列表
do
done
2.for 变量 in {1..100}
do
done
3.for((i=0;i<=100;i++))
do
done
5)until
until 条件(())/[]
do
done
6、数组
数组定义: arr=(aa bb)
获取某个元素: ${arr[index]}
设置某个元素: arr[index]=值
获取所有元素:
a
r
r
[
∗
/
@
]
获
取
长
度
:
{arr[*/@]} 获取长度:
arr[∗/@]获取长度:{#arr[]}
获取下标:${!arr[]}
连接数组: arr+=(cc dd)
删除元素: unset
a
r
r
[
i
n
d
e
x
]
分
片
:
{arr[index]} 分片:
arr[index]分片:{arr[*]:index:length}
数组遍历:
for i in ${!arr[*]};do echo ${arr[i]};done;
for A in ${arr[*]};do echo $A;done;
7.函数
hello(){
echo $1
echo $2
return 2
}
hello aa bb
echo $?