什么是linux
linux可以为我们做什么
- 打游戏
- 下软件
- 听音乐
系统服务器
- 连接Internet 网络
- 使用linux作为防火墙,路由器和DHCP服务器来保护和管理专用网络
- 运行WEB服务器
- 运行邮件服务器
- 运行文件服务器
linux的优点
- 自由,免费,开源
- 无需不停的重新引导
- 在不干扰其他服务的情况下启动/停止服务
- 软件的可移植性
- 可下载的应用程序-绿色软件
- 没有隐藏在代码或寄存器中的设置
- 成熟桌面系统:GNOME.KDE.X Window
- 不受病毒的困扰
linux 庞大的市场
- 自动汽车驾驶
- 办公
- 医疗B超
- 飞机
- 办公设备
linux体系结构
- Linux 内核
- Shell
- 文件系统
- 实用程序
- linux内核
- 内核是linux系统的最底层,提供了系统的核心功能,并允许进程以一种有序的方式访问硬件
- linux的系统启动过程包括四个步骤:
- 设备加电
- BIOS自检
- Grub/lilo引导启动
- 装载linux内核
- 系统初始化
- 用户登录
- 系统初始化:内核初始化阶段将启动系统进程和脚本,init进程系统开始的第一个工作,它是其他所有的进程父进程,并一直处于运行状态。使用top查看进程。
- EXT2.EXT3都是linux系统默认使用的文件系统类型。EXT3属于日志文件系统,是EXT2文件系统的升级版,EXT4是EXT3的升级版本
swap类型的文件系统在linux系统的安装文件- linux目录结构
- linux系统使用树型目结构,在整个系统中只存在一个根目录
- liunx系统中总是将文件系统挂载到树型目录结构中的某个目录节点中使用。
linux目录结构
- /bin-用来储存用户命令
- /home-用户目录
- /root根用户(超级用户管理员)的主目录
- /mnt-系统引导后被挂载文件系统的挂载点
- /tmp-临时目录
- /dev-设备目录
-/usr/bin/存放用户目录
-/etc-系统相关配置的文件
-/lib-共享目录
基本知识
- ctrl+alt+t显示终端。
- 点击左上角的搜索按钮,输入terminal,出来一个终端选项
注意:点击左边图标终端,将终端lock在桌面的左边- 关机
-右上角
-在终端下关机(1)sudo shutdown -h now
(2)sudo init 0- 关闭终端:exit
- 怎么获取超级管理权限:输入su;如果认证失败(1)sudo passwd进行修改超级用户管理员权限的密码
- 超级用户管理员---》普通用户 exit
- 修改登录密码:sudo passwd xxx用户回车
- shell基本命令
- pwd:present work directory显示当前工作路径
- ls:list显示当前工作路径下的目录或者文件
- ls-l:显示当目录下所有文件并且告知文件的相关属性
- ls-a:显示当前目录下是所有文件(包括隐藏文件:点开头)
- ls-al:集合上面两个特性
- ls+具体路径:显示具体目录下的子文件或子目录。
清空终端屏幕
- clear
- control+l
切换目录
- cd:change directory:改变工作路径
- cd+具体路径:切换到具体路径下面
- cd:切换用户主目录下
- cd.:.代表当前路径。
- cd..:..代表当前目录的上一层目录
- cd:代表用户主目录
- cd-:代表回到上一次操作的目录
tab键使用
- 补全当前系统下已有的shell命令,补全文件名
新建目录
- makdir:make directory:创建目录
- makdir+文件名:在当前工作路径下创建目录文件
- makdir -p 1010/1009:创建1010目录的同时创建1009目录
- rmdir;remove directory:删除目录
- rmdir+目录名:删除空目录不能删除非空目录
- rm -r+目录名:删除非空目录
创建文件
- touch:创建普通文件
- touch +文件名:在当前目录下创建普通文件
删除文件
- rm+文件名:在当前目录下删除对用的文件
拷贝文件
- cp:copy拷贝 文件
- cp +要拷贝的文件+拷贝到那个目录下
移动或者是重命名
- mv:move移动文件
- mv +要移动的文件+移动到那个目录下
- mv +要修改的文件+新的文件名
查看文件内容不需要打开文件
- cat +文件名
vi
- vi是一个文本编辑器
- vim是vi的升级版本
- 没有安装的话就在终端上面输入sudo apt-get install vim
- 如果遇到?E:no package...问题,解决之道
sudo apt-getupdate
gedit
- 是什么
- gedit是一个文本编辑器
文件权限修改
- -rw- r-- r--(-rwxr--r--)
-分析:第一个字母决定文件是什么文件;-代表普通文件;d:代表是目录文件- 第二个字母~第四个字母决定决定文件属主用户对其文件执行的权限rwx;r可读;w可写;x可执行;
- 第五个~第七个字母,决定与属主用户同组的其他用户执行的权限
- 最后几个字母,决定与属主用户不同组的其他用户执行的权限
chmod使用
- chmod 744 1.sh
- chmod u+x 1.sh;
- chmod u+x,g+w,o+w
u:usr代表属主用户;g:group同组的其他用户;o:other不同组的用户; a:all代表所有人- +:代表加某个权限; -:代表减掉某个权限
vim使用
- 打开文件:vim 1.sh
- 插入数据:按下i键,等待左下出现insert字样时,开始写数据
- 保存:按下ESC键,进入一个非可编辑模式,shift+:;输入w表示保存
- 退出:按下ESC键,进入一个非可编辑模式,shift+:;输入q表示退出;
退出的方式
- 注意点:一定要在非可编辑模式下进行操作
- :w保存
- :q退出
- :wq保存退出
- :q!不保存退出
- :wq!忽略之前保存的内容
vi快捷键
- dd:删除光标所在一行
- u:撤销上一次的操作
- yy:复制光所在的一行,p:粘贴到光标所在行的下一行
- 2dd:删除从光标起数两行
- 2yy:复制从光标起数两行
- 如果删除/复制多行,在非可编辑模式下进行操作,按下shift+v进入可视化模式,上下键选择要删除/复制的部分,按d/p键
vim简单配置
- cd /etc/vim
-sudo vim vimrc
- 来到最下面按i键进入插入模式
- set mouse=a 鼠标选中
- set nu 显示行号
- syntax on 语法高亮
- set autoindent 自动缩进
- set tabstop=4 缩进tab键字符宽度
- 进行保存退出
shell脚本执行
- chmod +x xx.sh ;./xx.sh
- 注意点:最好使用第一种
注释
:代表单行注释
shell脚本是一个弱类型的语言
- 不需要指定数据类型
- 如果变量没有定义,那么这变量默认为空
- 如果shell脚本文件某一行出错,不会影响我整个程序的运行
标识符的命名规范
- 硬件规范
- 不能数字开头
- 只能由字母,下划线,数字构成
- 不能与shell脚本的关键字相同if printf echo case等
- 建议:
- 不准用拼音,多查字典
- 建议使用驼峰命名规范numOfStudent
- 见名知义
变量的定义
- 变量=值
- 注意点:变量一定义出来,就必须给他一个值,否则语法错误
- =号左右两边不能有空格
- 如果右边是字符串,用""括起来
- 变量的使用
- 以$符号开头
echo简单用法
- echo:表明输出命令,输出echo后面的内容,会自动换行
- echo后面是否加"",'',不加;
- 加''里面写什么输出什么;例如value="hello"
echo '$value';输出结果是$value- 不加;降低程的可读性
- 加"";能避免上面两个缺点
- value="hello"
echo "{$value}1"
加{},不是(),为了分清变量
shell转义字符
- \n:代表换行
- \t:相当于敲了一个tab键的宽度
echo -e开启转义
- 如果是./xx.sh运行shell脚本,必须开启转义; value="hello"
echo "$value\n"是不会换行- 开启转义对特殊字符进行处理
echo -e "${value}\n"- 如果是sh xx.sh运行shell脚本,不需要开启转义
value="hello"
echo "${value}\n"是会换行的
变量的删除
- unset:unset 删除变量,不需要加$例如
value=9
echo "$value1"
unset value1
echo "value1"
输出为:9空
unset删除变量,删除的变量默认为空
只读变量
- readonly value=7,表明这个变量将来不能被重新赋值
- readonly修饰的变量不能被unset删除
字符串相关处理方法
- 计算字符串长度
value="hello"
length=${#value}
echo "${length}"
- 字符串拼接
value1="hello"
value2="world"
value3="${value1} ${value2}"
echo "${value3}"
3.字符串截取
value1="hello world"
value2=${value1:6:5}
#字符串从0开始,:6代表从0开始数到第6位开始裁,:5为截取的长度
printf
value="hello"
printf "value=%s\n"
"${value}"
- 用法:printf是输出""里面的内容;
%s:是一个占位符,严格意义上来说是输出字符串类型的- %f:是一个占位符,后面必须是小数类型的数值占位
- %d:是一个占位符,后面必须是整数类型的数值占位
- %c:是一个占位符,后面必须是字符类型的数值占位
- \n:转义字符
- 如果想用printf同时输出多个变量的值
value="hello"
value1=8
printf "value=%s\nvalue1=%d\n" "${value}" "${value1}"
- %.3f:表明小数点后面保留3位
- %6.3f:6表明整个数据所占宽度为6个字
- %m.nf:右对齐
- 如果m<=n+1+整数实际所占个数,m无效
- 如果m>n+1+整数实际所占个数,m才会出现一定的效果
- %-m.nf:左对齐
- %md:
- %ms:
- %mc:
read
printf "请输入一个值"
read value
printf "这个值为%s\n" "${value}"
- 用法:键读入一个值,赋给read
- 注意:read尽量不要使用同时输入多个值,比如read value1 value2
运算符
- 算数运算+ - * / %
- 注意点:expr是计算整数类型行的数据
- 运算符左右两边都必须要有空格
- ``和$()都是取结果集
- 注意乘法*必须要通过转义*,不然出错
num1=1
num2=2
num3=`expr $num1 \* $num2`
echo "${num3}"
num1=1
num2=2
num3=`expr $num1 + $num2`
echo "${num3}"
- `` 和$()不但可以取整数运算的结果集,还可以去shell命令结果集,比如:result=$(ls),但是两者后都要有expr
- num1%num2求num1/num2=商……余
num1=1
num2=2
num3=$(expr $num1 % $num2)
echo "${num3}"
- !:表示取反
echo "请输入一个数:"
read num
if [ ! $num -gt 8 ]
then
echo "<=8"
else
echo ">8"
fi
- &&:表示并且
- 第一种写法
echo "请输入一个数:\n"
read num
if [ `expr $num % 5` == 0 ]&&[ `expr $num % 3`==0 ]
then
echo "这是3,5的倍数"
else
echo "这不是3,5的倍数"
fi
- 用法:事件1&&事件2:事件1成立并且事件2成立,整个事件才成立,否则整个事件不成立
- 事件1||事件2:两个事件只要有一个事件成立,整个事件就成立
- 第二种写法
echo "请输入一个数:\n"
read num
if [[ `expr $num % 5` == 0 && `expr $num % 3`==0 ]]
then
echo "这是3,5的倍数"
else
echo "这不是3,5的倍数"
fi
- 第三种用法
printf "请输入一个年份:\n"
read year
if [ `expr $year % 4` == 0 -a `expr $year % 100` != 0 ] || [ `expr $year % 400` == 0 ]
then
echo "是闰年"
else
echo "不是闰年"
fi
- ||:表示或者
printf "请输入一个年份:\n"
read year
if [[ `expr $year % 4` == 0 && `expr $year % 100` != 0 ]] || [ `expr $year % 400` == 0 ]
then
echo "是闰年"
else
echo "不是闰年"
fi
let关键字
- 注意点:用了let之后 , let num3=$num1+$num2是错误的,let num3=num1+num2才是正确的
num1=1
num2=2
let num3=num1+num2
echo "${num3}"
用在哪些的运算符:
- 算数运算符:+ - * / % ++ --
- 赋值运算符:+= -= *= /= %=
- 后缀++
num1=1
let num3=num1++
echo "${num3}"
echo "${num1}"
- 结果为:1 2
- 前缀++
num1=1
let num3=++num1
echo "${num3}"
echo "${num1}"
- 结果为:2 2
- 后缀--
num1=1
let num3=num1--
echo "${num3}"
echo "${num1}"
- 结果为:1 0
- 前缀--
num1=1
let num3=--num1
echo "${num3}"
echo "${num1}"
- 结果为: 0 0
整数之间的关系运算符
- < > >= <= != ==
- 在关系运算符中,运算的结果是一个逻辑值,如果关系表达式成立,逻辑值为1;否则为0
- <, > ,>= ,<=都必要用\进行转义
- !=可以用\进行转义,也可不用\转义
num1=1
num2=2
num3=`expr $num1 != $num2`
echo "${num3}"
- 结果为1
- = ,\ =,\ ==, ==(根据编译器决定)maco0s支持=,\ =
条件语句
- 如果一个数大于5,然后输出这个数,否则 如果这个数小于五,然后说明这个数小5
if[]
then
语句体;
fi
- 注意点:[]左右两边都要有空格
- 关系运算符用-gt...表示
printf "请输入一个数"
read num
if [ $num -gt 5 ]
then
echo "${num}"
fi
- -gt:>
- -ge:>=
- -lt:<
- -le:<=
- -eq:==
- -ne:!=
- 字母含义
- g:greater
- t:then
- e:equal
- n:not
if []
then
语句体1
elif []
then
语句体
fi
if []
then
语句体1
elif []
then
语句体2
else
语句3
fi
- 注意点:else可以没有,如果有else,必须放在最后面,else下是没有then
- elif可以没有,必须放在if else中间任何位置
- if语句只能执行一个分支
- if的结束标志fi
字符串运算符
- =判断字符串是否相等
- !=判断字符串是否不相等
- -z:zero,判断字符串是否为空(没有字符)或着是不存在或者字符都是空格
printf "请输入两个整数:"
read num1
read num2
if [ $num1 -gt $num2 ]
then
printf "最大值为%s\n" "${num1}"
else
printf "最大值为%s\n" "${num2}"
fi
string1="hello"
if [ -z $string1 ]
then
echo "字符串为空"
else
echo "字符串不为空"
fi
- 结果为不为空
文件运算符
- -d:表示判断是否是目录文件
- -f:表示判断是否是普通文件
- -r:判断文件是否可读
- -w:判断文件是否可写
- -x:判断文件是否可执行
- -e:判断文件是否存在
file="1.sh"
if [ -d $file ]
then
echo "目录文件"
else
echo "不是目录文件"
fi
结果是:不是目录文件
file="1.sh"
if [ -f $file ]
then
echo "是普通文件"
else
echo "不是普通文件"
fi
- 结果为普通文件
file="11"
if [ -f $file ]
then
echo "是普通文件"
else
echo "不是普通文件"
fi
- 结果为不是普通文件
file="1.sh"
if [ -e $file ]
then
echo "存在"
else
echo "不存在"
fi
- 结果为存在
file="share"
if [ -e $file ]
then
echo "已存在这个目录文件"
else
cd
mkdir "share"
fi
case
case 变量 in
值1))
语句体
;;
值2))
语句体
;;
esac
echo "请输入一个值"
read num
case $num in
1)
echo "1"
;;
2)
echo "2"
;;
*)
echo "其他"
esac
- 注意点:结束标志必须是esac
- 值1)和值2)可以相同
- 如果值1)和值2)条件都不满足,这是会来到*)
- *) 你可以不写,但是如果要写就写在最后
- 没一个分支结束之后都有一个 ;;
数组
- 数组初始化:一个变量一个变进行初始化
array1[0]=8
array1[1]=9
- 注意点:一个一个变量进行初始化,可以间隔赋值还可以不从位置0开始.比如
array1[1]=7
array1[5]=8
- 整体数组赋值
- array={1 2 3 4 hello}
- 数组元素访问
- ${数组名[下标]}
- 遍历数组名里面所有的元素
- ${数组命[*]
- ${数组名[@]}
while循环
while []
do
语句体
done
sum=0
i=1
while [ $i -le 100 ]
do
let sum=sum+i
let i++
done
echo "sum=${sum}"
- sum为5050,i为101
- 求1~100的偶数和
sum=0
i=1
while [ $i -le 100 ]
do
if [ `expr $i % 2` -eq 0 ]
then
let sum=sum+i
fi
let i++
done
echo "sum=${sum}"
- 结果为sum=2550
- 练习2:9x9乘法表
i=1
j=1
while [ $i -lt 10 ]
do
j=1
while [ $j -le $i ]
do
let k=i*j
printf "%d*%d=%2d " "${i}" "${j}" "${k}"
let j++
done
printf "\n"
let i++
done
- 练习3:输入两个整数和一个运算符,根据运算符计算结果
printf "请输入两个整数:"
printf "请输入运算符:"
read num1
read num2
read ch
case $ch in
"*")
printf "%d*%d=%d" "${num1}" "${num2}" "$((num1*num2))"
;;
"/")
printf "%d/%d=%d" "${num1}" "${num2}" "$((num1/num2))"
;;
"+")
printf "%d+%d=%d" "${num1}" "${num2}" "$((num1+num2))"
;;
"-")
printf "%d-%d=%d" "${num1}" "${num2}" "$((num1-num2))"
;;
*)
printf "其他字符\n"
esac
参数
- ./xx.sh
- $0:代表执行的文件./xx.sh
- $1:代表执行的第一个参数
- $2:代表执行的第二参数
- $n:代表执行的第二个参数
- $#:代表执行参数个数,不包括命令本身
- 判断是否有参数,参数是否为1
- 判断文件是否存在
- 如果存在,判断文件是否是普通文件
- 改权限
4.运行- 让这个命令在全局有效
for循环
- 格式
for 变量 in 参数列表
do
done
- 用法解释:参数列表为变量一次一次的赋值
value=`ls`
for file in $value
do
echo "${file}"
done
for value in 1 2 3 4 5
do
echo "${value}"
done
break
- break:是跳出整个循环
i=1
sum=0
while [ $i -le 100 ]
do
if [ $sum -gt 55 ]
then
break
fi
let sum+=i
let i++
done
echo "sum=${sum}"
echo "i=${i}"
- 结果为:sum=66,i=12
- 分析:当i=11,sum>55,不成立sum=55
sum=sum+i,sum=55+11 ,i=12
- 用法:当碰到break时,直接跳出循环,break下面的语句不会被执行
- break只跳出最近的一循环
- break只能用在循环中
count=0
while [ $count -le 1 ]
do
i=1
sum=0
while [ $i -le 100 ]
do
if [ $sum -gt 55 ]
then
break
fi
let sum+=i
let i++
done
let count++
echo "sum=${sum}"
echo "i=${i}"
done
- 结果为 sum=66,i=12;sum=66,i=12
continue
i=1
sum=0
while [ $i -le 20 ]
do
if [ `expr $i % 10 ` == 3 ]
then
let i++
continue
fi
let sum+=i
let i++
done
echo "sum=${sum}"
- 分析:i=3时,i条件成立,执行continue,那么continue以下的语句就不被执行,继续返回到while判断的语句看条件是否成立,如果成立继续执行
- 用法:当碰到continue时,跳出本层循环的当前一次循环continue以下面的语句不会被执行
- continue只能用循环中
死循环
whlie :
do
语句体
done
shell函数
- 什么时候用到函数
- 执行的功能类似
- 根据实际需求 ,进行设置
- shell函数定义格式
function 函数名()
{
}
- 调用shell函数
- 函数名
- 函数参数传递
function test()
{
echo "$0"
echo "$1"
echo "$2"
echo "${10}"
echo "hello worid"
}
test 1 2 3 4 5 6 7 8 9 34
- 分析:当参数作为shell函数传递时,当在函数里面接收n>=10个参数时,要加上${n};
- $0不是test,而是shell文件本身
- 函数里面的$1与函数外面的$1不相同,但是函数里面的$0与函数外面的$0相同
function sum()
{
num1=$1
num2=$2
let value=num1+num2
return $value
}
sum 1 2
echo "sum=$?"
sum 2 3
echo "sum=$?"
- 结果为: sum=3,sum=5
- 分析:函数如果是return出来的结果,我们用$?接收,$?是接收最后运行的一次脚本.
- 如果return后面的值>255,那么函数运行完之后用$?接收,$?=value%256
- 怎么接收return出来的值比255大?问题解决之道:使用echo返回出来,函数外使用变量接收,value=
函数名
,从而value进行操作- 实际上echo是临时保存函数的结果集
function test()
{
echo 513
}
value=`test`
echo "test函数的返回值${value}"
- shell函数总结:
- function函数可写可不写
- shell 函数可以有return,也可以没有return
- 如果是return出来的结果必须要用$?接收
- 如果是echo保存的结果集,必须要用value=
test
取结果接收- 函数里面可以嵌套,可以内嵌创建函数
a()
{
b()
{
}
b
}
a
a()
{
b()
{
echo "==b=="
}
b
}
a
a()
{
b()
{
echo "==b=="
}
}
a
b
6.条件函数
a()
{
value=9
if [ $value -eq 9 ]
then
b()
{
echo "==b=="
}
else
c()
{
echo "==c=="
}
}
a
b
- 结果为==b==
- 分析:函数b和函数c在什么情况下可以调用? 先运行函数a,因为a中有函数b和c的实现.在if条件成立时,实现函数b的定义,其他情况下,实现函数c的定义