Shell的作用:
答:对内保护内核,对外给用户提供一个访问的窗口
编程语言的分类:
1.面向对象;面向过程
2.编译型编程语言;解释型编程语言(今天要讲的)--->分清:代码、程序、进程
用编译器 用解释器 -->产生可运行的程序
编译型:
-
需要编译器
-
对代码进行整体检查。如果代码中间有语法错误,则报错停止编译;如果没有错误,则将代码生成目标文件
解释型:
-
需要解释器
-
对代码进行逐句操作。如果代码中间某句有错误,则该句不被执行,但该句之前的代码已经执行。
二者比较的话,编译型的执行效率高,而解释型可移植性好
shell脚本需要的解释器就是shell本身
编写一个shell脚本
1.使用文本编辑器编译脚本文件.sh
#!/bin/bash
2.给shell脚本文件添加可执行权限
chmod 0775 ***.sh
3.执行脚本
shell 脚本变量--->shell编程唯一的一种变量类型:字符串类型
1.用户自定义变量
变量无需定义,直接使用;给变量赋值时,赋值号左右绝对不可以加空格-->加空格就是判等
如果使用该变量的值,则需要在该变量名前加 $
#!/bin/bash
A=3
B=4
echo "A is $A"
echo "B is $B"
#!/bin/bash
num=1
echo "I am ${num}nd"
如果变量名有粘连,可以用{}强调输出的变量-->I am ${num}nd
2.位置变量(命令行参数变量)
$0 命令本身
$1~$9 不同位置的命令行参数
#!/bin/bash
echo "0 is $0"
echo "1 is $1"
echo "2 is $2"
echo "3 is $3"
echo "4 is $4"
3.预定义变量
$# 命令行参数的个数
$@ 所有命令行参数(不计$0,同$*)
$? 前一个命令的退出状态--->返回:0 是真;1 是假。PS:C语言中的 return 0; 就是为了给内核看,正常结束了
$* 所有命令行参数(不计$0,同$@)
$$ 正在执行的进程ID号
echo "# is $#"
echo "@ is $@"
echo "* is $*"
echo "$ is $$"
4.环境变量
HOME 用户工作目录所在地址,在文件/etc/passwd文件内存储-->不能写~ 要写:$HOME
#!/bin/bash
mkdir $HOME/study/Home
IFS(Internal Field Separator) 内部字段分隔符,默认是空格、tab以及换行符
PATH Shell搜索路径
PS1 命令提示符格式($及$前的字符)(PS是Prompt Sign的缩写)
PS2 换行提示符>
TERM 终端类型,常见的值有vt100、vt200、ansi、xterm等
HISTSIZE 保存历史记录的条目数
LOGNAME 当前登录用户名
HOSTNAME 主机名称
SHELL 当前使用的Shell类型
LANG/LANGUAGE与语言相关的环境变量
MAIL 用户的邮件存放目录
TMOUT 设置的脚本过期时间。例如TMOUT=3则表示该脚本3秒后过期
UID 登录用户的ID
USER 显示当前用户名
SECONDS 记录脚本从开始运行到结束耗费的时间
env 可以查看所有的环境变量
Shell 的语句
1.说明性语句
以#开头的语句。说明性语句在脚本执行期间不会执行(解释说明的作用)
#!/bin/bash 也是说明性语句-->说明当前脚本文件作用Shell版本信息
2.功能性语句
三个特有的功能性语句:
-
read-->读取数据(都是字符串)两种读法:①一个read语句一次性读完输入完了再按回车②多个read每次读一个每读一个回车一次
#!/bin/bash
read DIR
ls -l $DIR
-
expr-->算术运算:+ - \* / % 各符号前后都要加一个空格,否则就会被认为一个字符串
#!/bin/bash
read VIR1 VIR2
ADD=`expr $VIR1 + $VIR2`
SUB=`expr $VIR1 - $VIR2`
MUL=`expr $VIR1 \* $VIR2`
DIV=`expr $VIR1 / $VIR2`
MOD=`expr $VIR1 % $VIR2`
echo "ADD is $ADD"
echo "SUB is $SUB"
echo "MUL is $MUL"
echo "DIV is $DIV"
echo "MOD is $MOD"
要想先计算再赋值,就需要加反引号``-->作用:优先执行该命令并且使用该命令的结果
-
test-->测试语句:可以测试字符串;测试整数;文件类型
test "hello"="hello"-->使用echo $?来查看比较结果-->等价于[ "hello"="hello" ] -->结合结构性语句里的 if 组合使用;结合|| ! &&
注:左右方括号都要加一个空格
(1)测试字符串
[ 字符串1 = 字符串2 ] #判定两个字符串是否相等
[ 字符串1 != 字符串2 ] #判定两个字符串是否不相等
[ -z 字符串 ] #判定字符串长度是否一致
(2)测试整数
a -eq b 测试a与b是否相等
a -ne b 测试a与b是否不相等
a -gt b 测试a是否大于b
a -ge b 测试a是否大于等于b
a -lt b 测试a是否小于b
a -le b 测试a是否小于等于b
PS:
equal 相等
not equal 不相等
greater than 大于
greater equal 大于等于
less than 小于
less equal 小于等于
newer than 新于……
older than 旧于……
(3)测试文件类型
-e name 测试一个文件是否存在
-d name 测试name是否为一个目录
-f name 测试name是否为普通文件
-L/h name 测试name是否为符号链接
-r name 测试name文件是否存在且可读
-w name 测试name文件是否存在且可写
-x name 测试name文件是否存在且可执行
-s name 测试文件是否存在且文件长度不为0
f1 -nt f2 测试文件f1是否比文件f2更新
f1 -ot f2 测试文件f1是否比文件f2更旧
3.结构性语句
(1)二重分支if-else
if 条件1
then
语句1
elif 条件2
then
语句2
else
语句3
fi
#!/bin/bash
read WHO
if [ $WHO -gt 0 ]
then
echo "这就是一个正数!!"
elif [ $WHO -lt 0 ]
then
echo "这是一个负数!!!"
else
echo "没错,这是0!!!!!!"
fi
(2)多重分支case
#!/bin/bash
read what
case $what in
file1)
echo "这是 file1 呀!"
;;
file2)
echo "这是 file2 啊! "
;;
*)
echo "这个是其他的东西"
;;
esac
(3)for循环
#!/bin/bash
SUM=0
for i in 1 2 3 4 5 6 7 8 9 10
do
echo "i is $i"
SUM=`expr $SUM + $i`
echo "SUM is $SUM"
done
echo "SUM is $SUM"
练习题:从键盘输入目录名,将目录内所有普通文件复制到~/backup文件夹内
分析:①怎么获取目录内的文件
②如果backup不存在怎么办?如果backup存在但是不为空怎么办?
③怎么使用for来赋值文件
#!/bin/bash
if [ ! -d $1 ] #检测你输入的是不是一个目录
then
echo "你给的不是目录"
exit
fi
flist=`ls $1` #把你输入目录里的文件存入flist中,作为后期for的查询字典
if [ ! -e $HOME/backup ] #检查是否存在这个文件夹
then
echo "backup不存在需要创建"
mkdir $HOME/backup
elif [ `ls $HOME/backup | wc -w` -ne 0 ] #查看这个文件夹内部是否有文件 | 管道符这里是统计文件夹内有多少个文件的
then
echo "backup不为空需要清理" #清理的过程就是删除原文件夹重新创建一个文件夹
rm -r $HOME/backup
mkdir $HOME/backup
echo "backup清空完毕"
fi
for i in $flist #开始进行循环复制
do
if [ -f $1/$i ] #表示你输入文件夹内的第i个文件
then
cp $1/$i $HOME/backup
echo "复制文件$!/$i"
fi
done
echo "复制文件完毕"
(4)while循环
#!/bin/bash
SUM=0
i=0
while [ $i -le 100 ]
do
SUM=`expr $SUM + $i`
i=`expr $i + 1`
done
echo "SUM is $SUM"
(5)提前结束循环的语句break和continue
#!/bin/bash
for i in 1 2 3 4 5 6 7 8 9
do
for j in 1 2 3 4 5 6 7 8 9
do
if [ $j -gt $i ]
then
break
fi
SUM=`expr $i \* $j`
echo -e "$j*$i=$SUM\t\c"
done
echo ""
done
echo -e echo支持转义字符
\c 不换行
\t tab
结束语句块语句fi
if 条件
then