1:开机脚本/etc/rc.local
sudo vi /etc/rc.local
echo "nameserver 192.168.8.1" >> /etc/resolvconf
2:Shell脚本的本质
Shell命令的有序集合。
命令who: 查看当前登录用户的信息。
date: 查看当前时间。
3:shell 编程的基本过程
step1: 编辑shell脚本文件。
step2: 添加可执行权限。(chmod)
m1: 8进制
sudo chmod 775 date.sh
m2: 字符方式
sudo chmod u+x date.sh
sudo chmod a+x date.sh
step3: 执行脚本
m1: 指明具体路径名。
m2(了解): 修改环境变量PATH,或者将可执行文件放到/bin, /sbin等环境变量指定的目录。
4:shell基本语法
4-1: shell变量
定义: 用了存储数据,shell将所有的变都解释为一串字符。
创建变量:
Variable=value
变量名=变量值。
使用:
在变量名前加"$"取出变量的值。
变量的分类:
a: 用户自定义变量
生命周期: 此种变量只能在用户的脚本文件中使用。
命令unset删除变量
b:环境变量(系统定义的变量)
生命周期: 从开机启动到关机之间都可以使用。
HOME: /etc/passwd文件中列出的用户主目录
PATH :shell搜索路径
PS1,PS2:默认提示符($)及换行提示符(>)
重点:
c:位置变量:用来保存命令行参数,此变量是可读型变量,不能更改。
$0: 存放shell脚本的名字
$1~9: 存放第一个到第九个命令行参数
${10}~${n}: 存放第十个到第n个命令行参数。
d:预定义变量: 保存一些其他信息。
$# 包含命令行参数的个数
$@ 包含所有命令行参数:“$1,$2,……$9”
$? 包含前一个命令的退出状态
$* 包含所有命令行参数:“$1,$2,……$9”
$$ 包含正在执行进程的ID号
5:基本命令
5-1: read从标准输入读入一行, 并赋值给后面的变量,其语法为:
read var
read var1 var2:如果从标准输入中输入的值超过2个,那么后面的值都赋给var2
5-2: expr: 算术运算命令expr主要用于进行简单的整数运算,包括加(+)、减(-)、乘(\*)、整除(/)和求模(%)等操作
注意:运算符和运算数之间要加空格。
5-3: test:测试字符串,整数,判断文件属性。
test命令测试的条件成立时, 命令返回值为真(0),否则返回值为假(非0).
$? 保存前一个命令的退出状态
--: 字符串:
s1 = s2 测试两个字符串的内容是否完全一样
如果一样的话,test返回0表示逻辑真, 如果不一样放回非0值表示逻辑假。
s1 != s2 测试两个字符串的内容是否有差异
如果 不一样的话,test返回0,
-z s1 测试s1 字符串的长度是否为0
-n s1 测试s1 字符串的长度是否不为0
--:整数测试
a -eq b 测试a 与b 是否相等
a -ne b 测试a 与b 是否不相等
a -gt(great than) b 测试a 是否大于b
a -ge b 测试a 是否大于等于b
a -lt b 测试a 是否小于b
a -le b 测试a 是否小于等于b
--:文件测试
类型:bcd-lsp
-d name 测试name 是否为一个目录
-f name 测试name 是否为普通文件
-L name 测试name 是否为符号链接
-b name: 测试name 是否为块设备文件
-c name: 测试name 是否为字符设备文件
-p name : 测试name 是否为管道文件
-S name: 测试name 是否为套接字文件
权限:
-r name 测试name 文件是否存在且为可读
-w name 测试name 文件是否存在且为可写
-x name 测试name 文件是否存在且为可执行
6:结构性语句
test命令测试的条件成立时, 命令返回值为真(0),否则返回值为假(非0).
6-1:条件语句(单分支语句)
if…then…fi
语法结构:
if 表达式
then 命令表
fi
other command
**: 如果表达式的值为真,则执行命令表,然后执行other command, 否则直接执行other command。
if…then…else…fi(双分支语句)
语法结构为:
if 表达式1
then 命令表1
else 命令表2
fi
other command
**: 如果表达式1的值为真,则执行命令表1,表达式1为假则执行命令表2.然后执行other command。
**:test 可以用[]来代替。
[+空格+判断表达式+空格+]
多分枝语句:
if 表达式1
then
命令表1
elif 表达式2
then
命令表2
else
命令表3
fi
other command
**:如果表达式1的值为真则执行命令表1,然后执行other command, 如果表达式1的值为假则判断表达式2,如果表达式2的值为真则执行命令表2中的内容。
否则执行命令表3中的内容。然后执行other command。
练习: 通过命令行传递参数的方式判断一个文件的类型。
例如, ./file_type.sh filename :判断文件filename的类型。
7:多路分支语句
多路分支语句case用于多重条件测试, 语法结构清晰自然. 其语法为:
case 字符串变量 in
模式1)
命令表1
;;
模式2)
命令表2
;;
……
模式n)
命令表n
;;
esac
other command
如果字符串变量的值和模式1相同,则执行命令表1中的内容。执行完后退出case语句,如果和模式1不相同则字符串变量和模式2相比较,如果相同,则执行
命令表2中的内容执行完后退出case语句,否则和模式3 比较,。。。。如果和模式n-1不相同则和模式n比较,如果和模式n相同则执行命令表n中的内容,然后退出
case语句,否则直接退出case语句。
8:循环语句
for 变量名 in 单词表
do
命令表
done
**: 当单词表示$@或者$*命令的行的所有参数时,可以省略in 单词表。
for 变量名
do
命令表
done
变量从命令行参数中去单词,也就是将命令行的所有参数作为单词表。
9:while…do…done
语法结构为:
while 命令或表达式
do
命令表
done
练习: 通过脚本创建文件
file0.txt, file2.txt,file4.txt,file6.txt,file8.txt,file10.txt,file12.txt,
break 和 continue
当循环语句中执行break时则跳出循环。
当循环语句中执行continue时则去执行下一次循环,省略此次循环的剩余部分。
10:shell函数
定义: 把完成固定功能、且多次使用的一组命令(语句)封装在一个函数里,每当要使用该功能时只需调用该函数名即可。
注意: 函数在调用前必须先定义,即在顺序上函数说明必须放在调用程序的前面。
注意: 可以给函数传递参数, 通过return返回一个值给调用函数的语句。
函数定义格式:
function_name ( )
{
command1
……
commandn
}
function function_name ( )
{
command1
……
commandn
}
函数的调用方式:
1: value_name=`function_name [arg1 arg2 … ]` : 将函数function_name的标准输出保存在变量 value_name中,
2:function_name [arg1 arg2 … ]
echo $?
用$?取出函数function_name的返回值(return 的值)
--: 变量
默认情况下函数中的变量是全局变量,即当函数执行完后变量的值不释放。
如果要定义局部变量则在变量前加local.
***: 如何一次注释多行。
底行模式
:n,ms/^/
作业
一: 符合下列三个要求
1:在用户的家目录下创建一个目录backup,如果此目录存在则不创建,
如果不存在则创建。(注意同一个目录下文件名不能相同)
2:将当前目录下的可执行的普通文件copy到家目录下的backup目录下。
3:统计符合条件的文件个数。
二:
通过read 从标准输入里输入学生成绩
通过多分枝语句判断学生成绩的等级。
大于等于60小于70:及格
大于等于70小于80:中等
大于等于80小于90:良好
大于等于90小于100:优秀
等于100 :优秀
三:通过man手册来学习find和grep的用法
find ./ -name "xxx" :在当前目录以及子目录中查找文件名为xxx的文件。
grep “xxx” ./* -r :在当前目录以及子目录中文中包含“xxx”内容的文件。