shell脚本编程语法学习树
1 shell简介
1.什么是shell?
Shell在英文单词中的意思是贝壳。在贝壳内部就是操作系统的内核,
贝壳外部就是用户,shell其实就是用户与内核进行交互的一个工具。
2.shell命令
Linux命令其实就是shell命令,shell命令大部分被存放在系统默认
路径 /bin (/usr/bin),使用shell命令的步骤:
1) 打开一个终端Terminal --> 终端其实就是shell命令的解释器 bash
2) 在终端上输入命令 --> 终端执行完命令之后会刷新一行命令提示行
3) Linux下的所有命令使用解释器bash进行解析 --> bash解释器所在位置
2 shell变量
2.1 shell变量命名规则
与C语言中的变量命令规则类似
Shell变量只能由数字,字母,下划线组成,不能是数字开头
2.2 shell变量的声明
Shell变量的声明是不需要指定类型的,数据的默认类型都是字符串类型
C语言 : int i; char ch; float f;
Shell : str
2.3 shell变量的赋值
Shell变量赋值时,等号两边不能有空格
str=hello #默认是字符串类型
2.4 shell变量的引用
–> 在变量名前面加上$
str=hello
echo $str #echo是往终端输出一串数据
==>hello
echo -->往终端输出一串数据
注意: echo命令是可以在输出的字符串中添加换行符 ‘\n’, 制表符 ‘\t’, 不换行 ‘\c’(echo命令默认在输出后换行),在使用这些符号时,需要在前面指定参数 -e
echo -e "hello world\c" #默认输出不换行
2.5 shell变量的种类
C语言变量: 局部变量 , 全局变量, 静态变量
Shell下的变量种类型
1) 用户自定义的变量 例如4中的str;
2) 系统环境变量 例如 PATH;
==> 可以在Linux下通过env查看系统环境变量
&修改系统环境变量PATH, 添加一个路径(/home/gec/Public)到PATH中
==> PATH=$PATH:/home/gec/Public (临时修改)
&如果想要永久修改环境变量
==> 那就把修改环境变量的命令写入终端启动脚本 (~/.bashrc)的最后一行
注意:如果在(~/.bashrc)启动脚本中误修改了一些命令,可能导致终端命令都用不了的严重后果;
3)命令行变量
$#:外部参数的个数
$ * : 外部参数的所有内容
$n: 数字n代表第几个参数
$?:上一个shell命令执行的返回值,成功返回0,失败返回非0
$$:代表当前的进程ID
3 特殊符号们
3.1 引号
引号有三种,双引号“”、单引号‘’、反引号``
3.1.1 单引号
‘’:如果一个字符串被单引号包含,其内部的任何成分都被视为普通的字符串,包括变量的引用或命令;
3.1.2 双引号
myname=Michael Jack
“”:此变量没有双引号将会报错,中间有空格时,第二个会被认为是命令,但很显然不对;
3.1.3 反引号
val=time
echo "$val:`date`" #会执行date命令
3.2 竖杠 | (管道)
ls -l | wc
注:ls -l负责收集目录文件信息,通过管道输送给wc计算出行数、单词个数和总字符数;
3.3 重定向(>、<、>>)
ls l> a.txt
echo 0<b.txt #echo会从b.txt中读取数据,而不是从键盘读取,并通过标准输入0
echo "hello" >> b.txt
4 字符串处理
1.计算字符串个数
val=hello
echo "${#val}"
==>5
2.删除字符串左边部分字符(#、##)
str=hello123a20lllllllz20world
level=${str##*[a-z]20}
echo "level##: $level"
level=${str#*[a-z]20}
echo "level#: $level"
注意:星号*的位置
==>level##:world
==>level#:lllllllz20world
3.删除字符串右边部分字符(%、%%)
str=hello123a20lllllllz20world
level=${str%%[a-z]20*}
echo "level%: $level"
注意放星号*的位置,要放在最右边,表示右边的任意字符,否则报错!
==>hello123
5 测试语句
1.对文件、数字、字符串进行判断的语句
注意:以下两种写法是相同的意思
#test1
if test -e file
then
cat file
fi
#test2
if [ -e file ]
then
cat file
fi
6 脚本语法单元
6.1 分支控制
1.if-else分支控制
格式:
If 判断条件1
then
Xxx; //执行语句1
elif 判断条件2
then
Xxx; //执行语句2
else
Xxx; //执行语句3
fi //if语句的结束标志
==>特点:
&当且仅当if语句后面的语句执行结果为真(即为0)时,then下面的才会执行;
2.分支语句case
格式:
case value in
A) 语句1 ;; //拿value与A进行比较,如果相等,那就执行语句1
B) 语句2 ;; //拿value与B进行比较,如果相等,那就执行语句2
C) 语句3 ;; //拿value与C进行比较,如果相等,那就执行语句3
*) 语句4 ;; //*是一个通配符,相当于C语言里面的defalut
esac
6.2 循环控制
1.循环语句 for
格式:
for value in arg #依次从arg中获取一个值给 value ,以空格为结束符
do
Xxxx; #执行语句
done;
2.循环语句 while
格式
while 循环条件 #条件为真时一直循环
do
Xxx;
done
3.until 循环
–> 一直循环,直到某种情况的发生
格式
until 判断条件 #==>当判断条件成立的时候,结束循环
do
Xxx;
done
declare -i n=1
until [ $n -ge 101 ]
do
echo -e "$n \c"
n=$n+1
done
6.3 函数
1.函数定义
格式: 函数名() //所有的参数默认都是字符串类型,不需要定义参数类型
==> $* : 代表函数执行的所有参数
$# : 函数的参数格式
$n : 代表函数执行的第n个参数
$? : 最近一次函数调用的返回值
2.函数调用
格式: 函数名 参数
fun()
{
for count in $*;
do
echo "$count";
done;
echo "arg number: $#";
return 2
}
fun "hello world nihao shijie" 12 3 #函数调用
echo "fun return is:$?";
6.4 trap
==> 格式 : trap 函数名 信号值
1.当脚本收到信号SIGINT时,忽略该信号
trap "" INT
例如: 设计脚本,每次捕捉到SIGINT信号就输出一个 字符串 hello
#!/bin/bsah
fun()
{
echo "hello"
}
trap fun INT
while [ 1 ]
do
sleep 1
done