00_shell
1、啥是shell
shell本质是脚本文件:完成批处理。
shell 是软件也是语言。
软件:shell命令解析器:(sh、ash、bash),将脚本文件逐行解析执行。
语言:shell脚本语言。必须复符合解析器的规则。
2、系统默认调用的两个脚本文件
/etc/profile ~/。bashrc
/etc/profile:对系统的所有用户都有效 用户登录系统的时候 执行。
~/。bashrc:对登录的用户有效 用户登录,打开终端。
3、写脚本的步骤
第一步:
1 #!/bin/bash 指明脚本解析器用bash
第二步:
写脚本
第三步:
给脚本增加 可执行权限
1 chmod +x 脚本文件
第四步:
执行脚本文件
1 。/00_shell。sh 前者首先检测#!,使用#!指定的shell,如果没有使用默认的shell
2 。 00_shell。sh 使用当前shell读取解释00_shell。sh
3 bash 00_shell。sh 直接指定使用bash解释00_shell。sh
如果执行shell格式出错:
方式一:
1 sudo apt‐get install dos2unix
2 dos2unix 脚本文件
方式二:
知识点2【shell的自定义变量】
1、定义变量
1 num=10
2、shell的变量 获取键盘输入
3、只读变量
4、脚本的变量导出为 环境变量
直接使用系统的环境变量
5、变量的注意事项
1、命名规则
变量名由字母、数值、下划线组成 不能以数值开头 不能是关键字。
2、变量使用时注意点
1 #等号两边不能直接接空格符
2 num = 100 #错误
3 num=100 #ok
4
5 #若变量中本身就包含了空格,则整个字符串都要用双引号、或单引号括起来
6 num=10 20 30 #错误
7 num="10 20 30" #ok
8 num='10 20 30' #ok
9
10
3、双引号、或单引号的区别
6、修改变量变量的值
案例:给PATH添加一个路径~/tool/opencv
1 export PATH=~/tool/opencv:$PATH
知识点3【shell的预设变量】
1 $#:传给shell脚本参数的数量
2 $*:传给shell脚本参数的内容
3 $1、$2、$3、。。。、$9:运行脚本时传递给其的参数,用空格隔开
4 $?:命令执行后返回的状态
5 "$?"用于检查上一个命令执行是否正确(在Linux中,命令退出状态为0表示该命令正确执
行,任何非0值表示命令出错)。
6 $0:当前执行的进程名
7 $$:当前进程的进程号
8 "$$"变量最常见的用途是用作临时文件的名字以保证临时文件不会重复
1 #!/bin/sh
2 echo "参数的个数:$#" #sh解析器有效
3 echo "参数的内容:$*"
4
5 #$1、$2、$3、。。。、$9:运行脚本时传递给其的参数,用空格隔开
6 echo "第一个参数:$1"
7 echo "第二个参数:$2"
8
9 # $?:命令执行后返回的结果或状态: 成功为0 失败为1
10 echo "上条语句执行的结果:$?"
11
12 # $0:当前执行的进程名
13 echo "当前的进程名:$0"
14
15 # $$:当前进程的进程号
16 echo "当前的进程名:$$"
知识点4【shell脚本的特殊用法】
""(双引号):包含的变量会被解释
''(单引号):包含的变量会当做字符串解释
``(数字键1左面的反引号):反引号中的内容作为系统命令,并执行其内容,可以替换输出为
一个变量
\ 转义字符:
同c语言 \n \t \r \a等 echo命令需加-e转义
(命令序列):
由子shell来完成,不影响当前shell中的变量
{ 命令序列 }:
在当前shell中执行,会影响当前变量
1 #!/bin/bash
2 echo "today is `date`"
3
4 # 转义字符
5 echo ‐e "##\n##"
6
7 # (命令序列) 启动子shell完整命令序列 不会影响当前shell的值
8 num=10
9 (
10 num=100
11 echo "()中的num=$num" #不会影响外部变量的值
12 )
13 echo "()外的num=$num"
14
15 # {命令序列} 当前shell完整命令序列 影响当前shell的值
16 num=10
17 {
18 num=100
19 echo "{}中的num=$num" #影响外部变量的值
20 }
21 echo "{}外的num=$num"
知识点5【条件测试】
1、条件测试的概述
语法1:使用关键字 test
1 test condition
语法2:使用[] 左右有空格
1 [ condition ]
2、文件测试
文件测试:测试文件状态的条件表达式
-e 是否存在 -d 是目录 -f 是文件
-r 可读 -w 可写 -x 可执行
-L 符号连接 -c是否字符设备 -b是否块设备
-s 文件非空
1 #!/bin/sh
2 test ‐e test。txt
3 echo "$?" #1 失败不存在
4
5 [ ‐e test。txt ]
6 echo "$?" #1 失败不存在
7
8 test ‐e a
9 echo "$?" #0 存在
10
11 [ ‐d a ]
12 echo "$?" #0 是文件夹
13
14 test ‐f a
15 echo "$?" #1 不是普通文件
16
17 [ ‐r a ]
18 echo "$?" #0 具备读权限
19 [ ‐w a ]
20 echo "$?" #0 具备写权限
21 [ ‐x a ]
22 echo "$?" #0 具备执行权限
23
24 test ‐s a。txt
25 echo "$?" #1 空文件
26
27 test ‐s b。txt
28 echo "$?" #0 非空文件
3、字符串测试
test str_operator “str”
test “str1” str_operator “str2”
[ str_operator “str” ]
[ “str1” str_operator “str2”]
其中str_operator可以是:
= 两个字符串相等 != 两个字符串不相等
z 空串 n 非空串
4、字符串的操作扩展
5、数值的测试
测试数值格式如下:
test num1 num_operator num2
[ num1 num_operator num2 ]
num_operator可以是:
-eq 数值相等
-ne 数值不相等
-gt 数1大于数2
-ge 数1大于等于数2
-le 数1小于等于数2
-lt 数1小于数2
6、数值的扩展
7、复合测试
&&:
command1 && command2
&&左边命令(command1)执行成功(即返回0)shell才执行&&右边的命令
(command2)
||
command1 || command2
||左边的命令(command1)未执行成功(即返回非0)shell才执行||右边的命令
(command2)
案例:test -f test。c && test -r test。c && test -w test。c
-a (and)两状况同时成立!
test -r file -a -x file
file同时具有r与x权限时,才为true。
-o (or)两状况任何一个成立!
test -r file -o -x file
file具有r或x权限时,就传回true。
! 相反状态
test ! -x file
当file不具有x时,回传true。
案例:test -f test。c -a -r test。c -a -w test。c
知识点6【if控制语句】
格式一:
if [条件1]; then
执行第一段程序
else
执行第二段程序
fi
案例1:查看当前某个文件是否存在 如果存在查看文件内容 不存在 创建改文件,赋值内容
输出内容
1 #!/bin/bash
2 read ‐p "请输入一个文件名" fileName
3 if [ ‐e $fileName ];then
4 if [ ‐f $fileName ‐a ‐s $fileName ];then
5 cat $fileName
6 else
7 echo "存在 但不是普通文件或者为空文件"
8 fi
9 else
10 # 文件不存在 创建文件
11 touch $fileName
12 echo "hello file" >> $fileName
13 cat $fileName
14 fi
格式二:
if [条件1]; then
执行第一段程序
elif [条件2];then
执行第二段程序
else
执行第三段程序
fi
知识点7【case控制语句】
case $变量名称 in
“第一个变量内容”)
程序段一
;;
“第二个变量内容”)
程序段二
;;
*)
其它程序段
exit 1
esac
知识点8【for循环语句】
形式一:
for (( 初始值; 限制值; 执行步阶 ))
do
程序段
done
初始值:变量在循环中的起始值
限制值:当变量值在这个限制范围内时,就继续进行循环
执行步阶:每作一次循环时,变量的变化量
1 #!/bin/bash
2 declare ‐i i=0
3 declare ‐i sum=0 # declare ‐i说明sum为整型
4 for (( i=0; i<=100; i++ ))
5 do
6 #sum=$sum+$i
7 sum+=$i
8 done
9
10 echo "sum=$sum"
形式二:
for var in con1 con2 con3 。。。
do
程序段
done
第一次循环时,$var的内容为con1
第二次循环时,$var的内容为con2
第三次循环时,$var的内容为con3
案例:扫描当前目录的文件
break跳出循环 continue直接进入下一次循环
知识点9【while循环语句】
while [ condition ]
do
程序段
done
当condition成立的时候进入while循环,直到condition不成立时才退出循环
until [ condition ]
do
程序段
done
这种方式与while恰恰相反,当condition成立的时候退出循环,否则继续循环
知识点10【函数】
有些脚本段间互相重复,如果能只写一次代码块而在任何地方都能引用那就提高了代码的可
重用性。
shell允许将一组命令集或语句形成一个可用块,这些块称为shell函数
定义函数的两种格式:
格式一:
函数名() {
命令 。。。
}
格式二:
function 函数名() {
命令 。。。
}
案例1:封装一个函数计算两个数据的和
案例2:函数分文件
18_shell。sh
17_shell。sh
晚上练习:
1 编写一个shell脚本实现:
2 判断用户家目录下(~)下面有没有一个叫test的文件夹
3 如果没有,提示按y创建并进入此文件夹,按n退出
4 如果有,直接进入,提示请输入一个字符串,并按此字符串创建一个文件,
5 如果此文件已存在,提示重新输入,重复三次自动退出,不存在创建完毕,退