作用:shell是贝壳的意思,贝壳内部就是操作系统的内核,贝壳外部就是用户,shell其实就是用户与内核交互的的一种工具。
2.shell命令
1)shell命令大部分被存放在系统的默认路径 /bin(usr/bin)
2)linux所有命令使用解释器bash进行解析 查看bash解析器所在位置 (在终端输入 which bash )
在写shell脚本的时候,第一行加 #!/bin/bash
3.Shell编程(使用linux下的编辑器gedit 或者 vi)
1)后缀:.sh 不需要编译(如gcc)
2)从编译到运行的步骤
编辑文件 ->hello.sh 修改权限 ->chmod 777 hello.sh 执行脚本文件-> ./hello.sh
Shell语法
1.Printf();è echo
2.read var è scanf(“%d”,&var)
echo命令是可以在输出的字符串中添加换行符 ‘\n’, 制表符 ‘\t’, 不换行 ‘\c’(echo命令默认在输出后换行),在使用这些符号时,需要在前面指定参数 -e
例如:echo -e “GZFX2107\nJAY\t192.168.15.255”
2.变量命名规则
与c语言相似 只能由数字,字母,下划线组成,不能是数字开头
- shell变量的声明
shell变量声明是不需要指定类型的,数据的默认类型都是字符串类型
c语言:int i
shell: str
- shell变量的赋值
c: int i=100;
shell: str=hello(shell赋值时,等号两边不能有空格)
- 变量的引用 -> 在变量名前加上 $
例如: str=hello
echo $str
- Shell变量的种类
C:局部变量 全局变量 静态变量
Shell下变量种类:
-
- 用户自定义的变量 例如:str=hello
- 系统环境变量 例如 PATH
- 可以通过env查看系统环境变量
- 命令行变量 $# $*(类似于c语言中的argc和 argv)
C: int main (int argc ,char *argv[])
Argc:命令行参数格式
Argv:命令行参数内容
==》 ./hello aaa bbb
Argc=3 argv[0]=./hellow argv[1]=aaa argv[2]= bbb
Shell: ./shell.sh aa bb
$#:外部参数个数 2个(不包含 ./hello.sh)
$*:外部参数的内容 aa bb
$n:数字n代表第几个参数 $1 àaa ;$2àbb
$?:上一个shell命令执行的返回值,成功返回0,失败返回非0
$$:代表当前的进程ID
Shell编程常用的符号
- 双引号 “”
==> 双引号的作用是将某些字符序列转成字符串类型。
==> 如果需要表示的字符串有空格,那么必须使用双引号修饰,
==> str=helloworld str=”hello world”
==> str=”helloworld”
- 反引号 ``
==> 在双引号中的可以直接使用$对变量进行引用,但是如果需要使用shell命令,那就需要使用反引号进行修饰。
例如:echo “date is `date`”
Str=`cat 1.txt` //把1.txt的内容赋值给 str
3.read var //scanf(“%d”,&var);
3.重定向 >(重定向) <(重定向) >>(追加重定向)
==> 作用:将某些命令的运行结果重定向到某个文件中
系统默认打开的文件描述符
文件描述符 对象
标准输入 0 键盘
标准输出 1 屏幕
标准出错 2 屏幕
==> 例如: ls 命令 的对象默认时标准输出
==> 例子: 将ls的信息重定向到文件1.txt中
注意: > 会将原来文件中的内容先清空,再把新的数据填入进去。
追加重定向 >> : 就会把数据追加到文件的末尾
例如: 现在想要写入一句话 “helloworld” 到文件1.txt
- 把1.txt清空再写入 echo “helloworld” > 1.txt
- 把1.txt追加写入 echo “helloworld” >> 1.txt
Shell编程的控制流语句
- shell编程的控制流语句
C语言中的控制流语句
循环: while; do-while; for
分支:if - else; switch - case;
Shell里面的控制流语句
循环: for; while; until;
分支: if - else case
测试语句 test ==> shell中对文件,数值,字符串进行判断的语句
Shell的if语句
- shell里面的if - else 分支语句
格式:
If 判断条件1
then
Xxx; //执行语句1
elif 判断条件2
then
Xxx; //执行语句2
else
Xxx; //执行语句3
fi //if语句的结束标志
==>特点:
- 每一个if语句都必须由一个fi作为结束标志
- If 语句后面的条件为真的时候,才会执行then后面的语句
- If 判断条件; 等价于 if 判断条件 加不加分号都可以
Shell分支语句中的case(c中的swich)
, 分支语句case
格式:
case value in
- 语句1 ;; //拿value与A进行比较,如果相等,那就执行语句1
- 语句2 ;; //拿value与B进行比较,如果相等,那就执行语句2
- 语句3 ;; //拿value与C进行比较,如果相等,那就执行语句3
*) 语句4 ;; //*是一个通配符,相当于C语言里面的defalut
esac
注意:
- Case语句只有case,没有switch
- Case语句中没有break, 每一个分支的结尾使用 ;;
- Case 语句结尾使用 esac结尾
Shell循环语句for
循环语句for
格式:
For value in arg #一次从arg中获取一个值给value
Do
Xxx
Done;
注意:for循环执行的次数与arg中的数量有关,有多少数值就循环多少次。
例子:将外部传参的值打印出来。
Shell循环语句while
- 循环语句 while
格式
while 循环条件 #条件为真时一直循环
do
Xxx;
Done
例子:输出1-100所有的奇数
Shell循环语句until 循环 --> 一直循环,直到某种情况的发生
格式
until 判断条件 #==>当判断条件成立的时候,结束循环
do
Xxx;
Done
hell其他
- 字符串长度获取
C语言 : strlen(str) ==> 返回字符串str的长度
Shell : ${#str} ==> 获取str字符串长度
- 字符通配符 ==》 匹配字符的符号
* : 任意长度任意字符的字符
? : 任意一个字符
- z] : 代表一个范围 a ~ z
[^abcd] : 代表一个指定范围之外的字符
[abc] : 代表一个指定范围之内的字符
%% : 表示从右到左匹配尽可能多的字符
% : 表示从右到左匹配尽可能少的字符
## : 表示从左到右匹配尽可能多的字符
#: 表示从左到右匹配尽可能少的字符
- 删除字符串左边的字符
例如: str=hello123a20world
Level=${ str##[a-z]20 } #--> 从左到右一直删除字符,直到碰到 小写字母+20的时候结束,把这两个删除就停止。
Trap:信号捕捉 -》 类似于c语言里面的signal
格式:trap 函数名 信号值