一、Linux命令
1、Linux目录结构
FHS标准(文件系统层次标准):
(1)/boot:启动目录,内核存放地,当前文件系统存放的地方
(2)/etc:配置文件存放地
(3)/tmp:程序产生的临时文件
(4)/home:用户的目录,新增用户账号时,用户的主目录都存放在此目录
(5)/lib:库文件,程序在执行过程中,需要调用一些额外的参数时需要函数库的协助
(6)/bin:可执行文件和常用的Linux命令
(7)/sbin:系统管理员的命令和工具
(8)/usr:应用程序和文件安装地
(9)/mnt:挂接其他文件系统(如挂接U盘)
(10)/root:root账户的home目录(根目录)
(11)/dev:存放Linux系统下的设备文件(设备目录)
2、Linux命令
(1)vi:生成新文件或者编辑、查看文件
从命令模式进入编辑模式:i插入文本,a追加文本
esc从编辑模式进入命令模式
在vi编辑器中可执行的操作:
①:w 保存文件
②:wq 保存并退出
③:wq! 保存并强制退出
④:q 退出
⑤:q! 强制退出
(注意:以下的命令都不同进入可编辑模式)
⑥dd 删除一行文字
⑦x 删除一个字符
⑧:n 光标移动至文本第n行
⑨$ 光标移动至文本的行尾
⑩G 光标移动至文本末尾
⑪/ 查找某个字符(如/df 查找df出现的首次位置信息)
(2)pwd:显示当前用户所处的路径
(3)cd 目录名:改变用户所在的目录
①cd ..返回上一级目录
②cd 进入根目录(用户的主目录)
(4)ls:查看指定目录下的内容
格式:ls [参数] [目录或文件]
注意:在格式中,大括号的内容是必写内容,中括号的内容是可写内容,|竖线左右两边是二选一
参数:①-a 列举目录中的全部文件,包括隐藏文件
②-l 列举目录中的细节,包括权限、所有者、组群、大小、日期、是否建立链接等等
③-r 逆向,从后向前列举目录中的内容
④-R 递归,列举当前目录下所有子目录中的内容
⑤-s 查看文件或目录的大小
(5)cat:显示文本的内容
(6)touch:创建文本(但是不能插入内容)
(7)grep 字符串 文件名:在文件当中查找特定的一个字符串。
如:grep money test.txt即在test.txt文件中查找money这个字符串,grep查找字符串区分大小写
(8)cp:拷贝文件或复制文件,在复制的过程中我们可以重新命名
格式:cp [源文件] [目标文件]
参数:①-i 互动,如果文件将覆盖目标中的文件,它会提示确认,y确认,n不确认
②-r 递归,复制的时候会复制整个目录、子目录以及其他
③-v 详细,显示文件的复制进度
(9)mv:对文件或目录进行移动,相当于剪切,通过mv命令,可以对当前文件进行重命名
格式:mv [源对象] [目的对象]
参数:①-i 互动,如果文件将覆盖目标中的文件,它会提示确认,y确认,n不确认
②-f 强制,不提示地移动文件
③-v 详细,显示文件的复制进度
(10)mkdir:创建目录,可以同时创建多个目录
参数:-p可以创建嵌套目录,目录里面只能嵌套一个目录
(11)rmdir:删除空目录,可以同时删除多个空目录
(12)rm:删除文件
格式:rm [参数] [文件]
参数:①-i 互动,提示确认删除
②-f 强制,不提示地确认删除
③-v 详细,显示文件的删除进度
④-r 递归,删除某个目录以及其中所有的文件和子目录
(13)退出:exit
(14)重新启动:reboot/shutdown -r
(15)关机:halt/shutdown -h
(16)ps:查看在计算机系统中,有哪些程序正在执行及执行的情况(查看进程),也可以列出所有程序占用内存的情况
找出所有进程号(PID)和名称
参数:①-l 长格式列出
②-u 列出使用者的名称和使用时间
③-m 列出内存分布情况
④-r 只列出正在执行的程序,不列出其他信息
⑤-x 列出所有程序
(17)top:动态查看目前程序的执行情景和内存使用
终止使用top:Ctrl+C 或者q
它和ps类似,但是它几秒钟就会更新一次系统状态,方便追踪
(18)kill:终止一个正在执行中的进程
kill -l 列出所有当前可以使用的信号名称
(19)man:查询和解释命令的使用方法和这个命令的注意事项,按下q退出(如:man ls,查询ls命令的说明书页)
(20)locate:定位文件和目录(这里的文件和目录来自于数据库)
如:locate test:使用数据库来定位带文件或者目录名中有test这个词的文件或者目录
在centos中,如果这个命令不可以用,在使用这个命令之前需要先执行updatedb,更新当前列表里面的数据库
(21)whatis:查询某个命令的含义(如:whatis mv)
在centos中,在使用这个whatis命令之前,需要加载一下whatis(加载方法:makewhatis)
(22)bzip2:压缩文件,文件保存为bz2的后缀名,注意这里只能对文件进行压缩,不能对目录进行压缩
格式:bzip2 文件名字
对应的bz2文件的解压缩方式:bunzip2 文件名.bz2
(23)gzip:压缩文件,文件保存为gz的后缀名,处理的对象还是文件
对应的gz文件的解压缩方式:gunzip 文件名.gz
-r 递归处理,将指定目录下的所有文件以及子目录里面的文件一并处理,处理对象针对的是文件
(24)tar:将文件或者目录进行打包、或者解压缩
格式:tar [参数] [打包后的文件名] [需要打包的文件或者目录]
参数:①-c 创建压缩文件
②-x 展开归档文件
③-t 显示包括在tar文件中的文件列表
④-z 压缩、解压缩文件(gz格式)
⑤-v 写入或读取时,显示所有文件
⑥-f 指明要展开的归档文件名
⑦-j 压缩或解压缩文件(bz2格式)
记住:tar cvf test.tar /home/test(cvf就是一个打包的过程,这里可以把多个源文件打包到一个目标文件中去)
tar xvf test.tar(xvf就是一个解压缩的过程)
tar tvf test.tar(列出tar文件的内容及详细信息)
tar压缩或者解压缩对源文件没有任何影响,源文件还放在原来的位置
(25)head:查看文件的开头部分,不给设置行数的时候默认显示前10行(如:head -20 file可以查看file文件的前20行内容)
tail:查看文件的结尾部分,默认显示10行
(26)more:按页来查看文件内容,用空格键和b键来进行前后的移动,q键退出
格式:more [参数] [filename]
参数:①-num 一次显示的行数
②-f 计算行数时,以实际上的行数,而非自动换行后得到的行数
③+num 从第num行开始显示
④还可以使用more在文本文件中搜索关键字,如: more +/lq test.txt,在test.txt文件中查找第一个lq所出现的行,并从该 出前两行显示输出后面的所有内容
⑤管道符| 当一个目录下的文件太多时,可以使用more来分页显示,这时需要和管道符|搭配使用:
如: ls -al 1.txt | more -5
|表示管道,作用是可以将前面命令的输出当作后面命令的输入
(27)which:从path环境变量所列的目录中找出命令的位置,并显示完整路径的名称。一旦找到第一个符合条件的程序文件时,就立刻停止搜索,省略其余未搜索出的目录。
(28)whereis:查找符合条件的所有文件,whereis命令只能用于程序名的搜索,定位一些文件在文件系统中的位置
格式:whereis [参数] 文件名
参数:①-b 只找出二进制文件
②-s 只找source源文件
(29)chmod:给文件赋予权限
格式:chmod [ugoa][+-=][rwxcfXR…][filename]
参数:①u表示文件的拥有者,g表示与该文件的拥有则属于同一个群体者,o表示其他以外的人,a表示这三者皆是
②+表示增加权限,-表示取消权限,=表示唯一设定权限
③r表示可读取,w表示可写入,x表示可执行,c表示若该文件权限确实已经更改,才显示其更改动作,R表示对当前目录 下所有文件与子目录进行相同的更改权限(即以递回方式逐个变更)X表示只有当该文件是个子目录或者该文件已经被 设定过为可执行
chmod赋予权限除了用字母表示权限也可以用数字来表示权限,格式 chmod num1num2num3 filename
其中num1、num2、num3各为一个数字,分别表示User,Group,Other的权限,r=4(读取),w=2(写入),x=1(可执行)
chmod u+rwx,g=rx,o=x filename等价于chmod 751 filename
(30)useradd:添加/创建用户;userdel删除用户
用户都是放在home目录下的
格式:useradd [用户名],userdel [参数] [用户名]
在删除用户的是如果不加参数,使用userdel [用户名]直接删除后会残留用户的一些目录,该语法删除了用户,但不能删除目录/home/用户名 ,加上参数-r后才可以将目录一起删除(userdel -r cheng)
(31)chgrp:用于变更文件或目录的所属群组(group的修改)
chgrp li 1.txt,将1.txt这个文件的权限赋予li这个用户所在群组的权限
(32)chown:将文件的拥有者改为指定的用户或者组(user的修改),这个命令只有root用户才能使用。
注:文件的拥有者:Linux系统为每个用户提供一个用户主目录,用户主目录为/home/
文件的组:举个例子,每个公司都有自己的共享资料,如果你是这个公司的人,你就可以使用,包括读写。如果不是这个公司的人,你就没有权限去使用。我们可以在Linux系统中为该公司建立一个群组,将该公司的所有成员添加到该群组中。然后将属于这个公司的文件所属群组设置为该群组,然后将文件的群组权限设置为可读写,于是该群组所有成员便都可以查看和修改,而不属于该群组的用户便没有这个权限了。
其他:除了文件所有者或者文件所属组成员的用户,都是其他人。
root用户可以访问Linux上的所有文件。
(33)su:用来切换用户
格式:su 用户:切换用户,但当前的环境变量保持为现在用户的环境变量
su -l 用户:切换用户,并且环境变量切换到更改用户
(34)passwd:修改用户密码
格式:passwd 用户名
注意:只有root用户才可以修改用户密码
(35)df:检查硬盘的使用量
参数 -a:可以列出全部文件系统和各分区的磁盘使用情况(df -a)
(36)du:显示文件目录大小
格式:du [参数] [文件名]
参数:-ab:列出所有文件和目录所占的空间
(37)ifconfig:显示网络设备的状态(注意:这里是ifconfig,而在windows中是ipconfig)
注:配置Linux的网络IP:
配置Linux的网络IP,网络配置分为自动获取IP地址(动态ip)和手动配置IP地址(静态ip)
①动态配置ip地址:
i)在/ect/sysconfig/network-scripts文件夹中用来存放网络配置相关的文件,ip配置文件为ifcfg-eth0
进入这个ip配置文件,有BOOTPROTO = dhcp(表示动态),ONBOOT = yes(允许动态),这两个参数组合在一起就表示可以动态动态设置ip地址
ii)修改完以上两个参数后,要重启网络服务(service network restart),才能生效
②静态配置ip地址:
i)进入ip配置文件,有BOOTPROTO = static(表示静态)
ii)设置IPADDR(ip地址)(如:IPADDR = 10.0.109.221)
iii)设置NETMASK(子网掩码)(如:NETMASK = 255.255.255.0)
iv)设置GATEWAY(网关)(如:GATEWAY = 10.0.109.3),网关前三位和ip的前三位一样
v)还需要写一个网络连接尝试的函数:
check_link_down(){
return 1;
}
(38)ping:用于检测当前主机和目标主机是否能够进行连接。执行ping指令会使用ICMP传输协议,发回要求回应的信息。
(39)netstat:显示整个Linux系统的网络状况,参数-a表示显示网络的详细状况,参数-apu表示显示UDP端口号的使用情况
二、shell编程
1、shell是什么
shell是用c语言编写,用户和Linux系统通信的桥梁
shell是一种应用程序,shell脚本(shell script)是一个可执行文件
2、shell环境
shell编程只要有一个能编写代码的文本编辑器和一个能解释执行的脚本解释器(/bin/bash、/usr/bin/sh、/bin/sh)就可以了。
shell可以将很多命令写在一起,一次执行多个命令
bash的环境文件:①.bash_profile 设置环境变量,账户一建立,该文件就存在
②.bashrc 存放bash命令,每次启动就去执行它,在.bash_profile之后执行
③.bash_logout 在退出注册时运行
④.bash_history历史记录
3、shell脚本格式
(1)格式:vi filename.sh注意这里的格式并不是唯一的,只要是一个可以编辑的文件就行,没有规定一定要sh文件
(2)脚本第一行格式:#!/bin/bash
符号#!用来指定要执行脚本的解释程序,这里就是指定要使用bin目录下的bash解析器
echo表示输出语句(echo "hello world"),echo输出字符串可以不写引号
(3)执行脚本文件的两种方法:
①i)先将文件赋予可执行权限:chmod +x filename.sh
ii)执行./filrname.sh
注意,这里文件要写上完整路径,或者文件名前面加./表示在当前执行语句的路径下的filename.sh
如果不加上完整路径或者不加./,Linux就会去path里面找文件
②执行/bin/bash filename.sh
(4)shell中的变量
①变量是指在程序运行过程中可以随时发生改变的量
②变量的种类有两种:用户自定义变量和系统变量
③用户自定义变量的申明(变量名字=值 ):my_name="xiaowanzi",注意,变量名和等号之间不可以有空格
注意:(变量名的命名规则):i)首个字符必须是字母
ii)中间不可以使用空格,可以使用_来表示
iii)不能使用标点符号
iv)不能用bash里面的关键字
④变量输出的两种方式:i)echo $变量名
ii)echo ${变量名}
变量名外面的花括号是可选的,加不加都行,加花括号是为了帮助解析器识别变量的边界
如果在一个文件中只定义了变量your_name,直接写输出echo "$your_nameYT"就会出错,这时候就要给变量加一个花括号
echo "${your_name}YT"
⑤只读变量:可以使用readonly关键字将变量定义为只读变量,变量只能读取不能更改,使用方法:readonly 变量名
⑥删除变量:unset
语法:unset 变量名
注意:unset命令不能删除只读变量,变量删除后不能再次使用。
(5)字符串操作
①拼接字符串:将要拼接的字符串直接写到一块,其中变量写在${ }的花括号之间(如:echo "hello,${name}YT!")
②获取字符串长度:${#变量名},如${#string}
③提取子字符串:${变量名:num1:num2},num1表示截取位置,num2表示截取长度。num1:num2表示要截取的字符串从num1+1的位置开始截取,截取num2个字符,如${string:1:4}即从string的第二字符开始截取4个字符
(6)shell数组:多个相同类型的变量组成的集合
①定义数组:用括号来表示数组,数组元素用空格符分隔开
格式:数组名=(值1 值2 … 值n)
还可以单独定义数组的各个分量,如:array_num[0] = value0
②读取数组,数组下标从0开始
格式${数组名[下标]},如:${array_num[0]}
③使用@符号可以获取数组中的所有元素,如:${array_num[@]}
④获取数组元素的长度:i)计算数组中的元素个数:${#array_num[@]}
ii)计算的数组中单个元素的长度:${#array_num[n]},表示获取数组中第n+1个元素的长度
(7)shell注释:以#开头的行就是注释,会被解释器忽略,sh里面没有多行注释,只能每一行加一个#
(8)shell基本运算符
①expr是一款表达式计算工具,使用它能完成表达式的求值操作,两数相加,要使用反引号
如:val=`expr 2+2`,注意(两数相加,这里使用的是反引号,而不是单引号)
假设变量a为10,变量b为20
运算符 说明 举例
+ 加法 $ `expr $a+$b` 或 $ (( a + b))
注:这里的$(())是一个数值运算符,对括号里面的变量可以加$符,也可以不加$符
- 减法 `expr $a-$b`
* 乘法 `expr $a*$b`
/ 除法 `expr $a/$b`
% 取余 `expr $a%$b`
= 赋值 a=$b
== 相等 $a == $b
!= 不相等 $a != $b
(9)shell中的判断条件格式:
①if语句(if…fi)
if [判断条件1]
then
输出结果1
elif [判断条件2]
then
输出结果2
else
输出结果3
fi
#!/bin/bash
echo "请输入第一个数字:"
read num1
echo "请输入第二个数字:"
read num2
if [ $num1 -eq $num2 ]
then
echo "num1等于num2"
elif [ $num1 -gt $num2 ]
then
echo "num1大于num2"
elif [ $num1 -lt $num2]
then
echo "num1小于num2"
else
echo "请输入有效的数字"
②case语句(case…esac)
格式:
case &变量名 in
"第一个变量内容")
程序段1
;;
"第二个变量内容")
程序段2
;;
*)
程序段3
exit 1
;;
esac
注意:i)case语句必须以esac为结尾
ii)每个变量内容的程序段最后都需要用两个分号来表示该程序段的结束
iii)最后的*表示剩余的其他情况
#!/bin/bash
echo ""
read num
n=$(( $num/10 ))
case $n in
10)
echo "优秀"
;;
9)
echo "优秀"
;;
8)
echo "良好"
;;
7)
echo "良好"
;;
6)
echo "及格"
;;
*)
echo "不及格"
;;
esac
(10)关系运算符:关系运算符只支持数字,不支持字符串,除非字符串的值是数字
假定变量a是10,变量b是20:
运算符 说明 举例
-eq 检测两个数是否相等,相等返回true [ $a -eq $b ]
-ne 检测两个数是否不相等,不相等返回true [ $a -ne $b ]
-gt 检测左边数是否大于右边的数,大于返回true [ $a -gt $b ]
-lt 检测左边数是否小于右边的数,小于返回true [ $a -lt $b ]
-ge 检测左边数是否大于等于右边的数,大于等于返回true [ $a -ge $b ]
-le 检测左边数是否小于等于右边的数,小于等于返回true [ $a -le $b ]
注意:这里[ ]和$之间是存在一个空格的,不能连着来写
(11)布尔运算符,只有两个结果:true和false
假定变量a是10,变量b是20:
运算符 说明 举例
! 非运算,表达式为true,则返回false [ !false ]
-o 或运算,有一个表达式为true,则返回true [ $a -lt 20 -o $b -gt 100 ]
-a 与运算,两个表达式都为true,才返回true [ $a -lt 20 -a $b -gt 100 ]
(12)逻辑运算符[[ && ]] [[ || ]]
假定变量a是10,变量b是20:
运算符 说明 举例
&& 逻辑与 [[ $a -lt 20 && $b -gt 100 ]]
|| 逻辑或 [[ $a -lt 20 || $b -gt 100 ]]
注意:使用逻辑与和逻辑或需要用两个中括号括起来
(13)字符串运算符
运算符 说明 举例
== 检测两个字符串是否相等,相等返回true [ $a == $b ]
!= 检测两个字符串是否不相等,不相等返回true [ $a != $b ]
-z 检测字符串长度是否为0,为0返回true [ -z $a ]
-n 检测字符串长度是否不为0,不为0返回true [-n $a]
str 检测字符串是否为空,不为空返回true [$a]
(14)文件测试运算符
文件测试运算符用于检测文件的各种属性
运算符 说明 举例
-d file 检测文件是否是目录,如果是返回true [ -d $file ]
-f file 检测文件是否是普通文件,如果是返回true [ -f $file ]
-r file 检测文件是否可读,如果是,则返回true [ -r $file ]
-w file 检测文件是否可写,如果是,则返回true [ -w $file ]
-x file 检测文件是否可执行,如果是,则返回true [ -x $file ]
-s file 检测文件是否不为空 (文件大小是否大于0),不为空返回true [ -s $file ]
-e file 检测文件(包括目录)是否存在,存在返回true [ -e $file ]
(15)echo命令:用于字符的输出
①显示普通字符
echo "hello,world" ,这里的双引号可省略
②显示转义字符,在需要转义的字符前面加上\
echo "\"hello world\""
③显示变量:${变量名}
④显示换行(\n),首先要使用-e开启转义
echo -e "OK! \n"
echo "hello world"
⑤显示不换行(\c),一样首先要用-e开启转义
echo -e "OK! \c"
echo "hello world"
⑥显示结果定向至文件(>):输出的内容写入某个文件中
echo "hello,world" > filename
⑦显示命令执行结果,用反引号(` `)
如:echo `date` 显示当前日期
echo`cal`显示当前月份的日历
(16)printf输出命令
格式:printf 格式声明 与格式声明相对应的参数列表
格式声明由两部分组成:百分比符号(%)和指示符
%d 数字,对应位置参数是数字型
%s字符串,对应位置参数是字符串
%c字符,对应位置参数是字符
%f浮点,对应位置参数是浮点型
(17)常见的转义字符(要加-e开启转义)
\b 后退(将\b起前面的字符掩盖掉) \n 换行 \t 水平制表符 \\ 反斜杠字符
在printf中转义字符可以直接使用,不用首先用-e开启转义
printf "%-10s %-8s %-4.2f\n" name sex 48.6785
%-10s指定一个宽度为10的字符(-表示左对齐,没有则表示右对齐)字符不足自动以空格填充,超过也会全部显示出来
%-4.2f指格式化为小数,其中.2指保留两位小数(四舍五入)
printf "%s %s %s \n" a b c d e f g 输出结果(按格式自动匹配)
a b c
d e f
g
(18)test命令:用于检查某个条件是否成立,test命令和[ ]一样,可以进行数值、字符和文件三个方面的测试
①数值测试
参数 说明
-eq 检测两个数是否相等,相等返回true test $a -eq $b
-ne 检测两个数是否不相等,不相等返回true test $a -ne $b
-gt 检测左边数是否大于右边的数,大于返回true test $a -gt $b
-lt 检测左边数是否小于右边的数,小于返回true test $a -lt $b
-ge 检测左边数是否大于等于右边的数,大于等于返回true test $a -ge $b
-le 检测左边数是否小于等于右边的数,小于等于返回true test $a -le $b
注:使用read可以输入变量
②字符串测试
运算符 说明 举例
== 检测两个字符串是否相等,相等返回true test $a == $b
!= 检测两个字符串是否不相等,不相等返回true test $a != $b
-z 检测字符串长度是否为0,为0返回true test -z $a
-n 检测字符串长度是否不为0,不为0返回true test -n $a
str 检测字符串是否为空,不为空返回true test $a
③文件测试
运算符 说明 举例
-d file 检测文件是否是目录,如果是返回true test -d $file
-f file 检测文件是否是普通文件,如果是返回true test -f $file
-r file 检测文件是否可读,如果是,则返回true test -r $file
-w file 检测文件是否可写,如果是,则返回true test -w $file
-x file 检测文件是否可执行,如果是,则返回true test -x $file
-s file 检测文件是否不为空 (文件大小是否大于0),不为空返回true test -s $file
-e file 检测文件(包括目录)是否存在,存在返回true test -e $file
注:shell中的三个逻辑运算符(!、-a、-o)优先级为!> -a > -o
(19)判断符号[ ]
①使用判断符号[ ]来进行数据的判断,大多用在if…then…fi中
②判断符号[]中每个组件都要用空格来分隔
如:name="xiaowanzi"
[ "$name" == "xiaowanzi" ]
注意:i)方括号的左右两边都有一个空格
ii)方括号中的变量最好用双引号来设置
(20)循环语句
①while…do…done
当判断条件成立时就进行循环,直到判断的条件不成立才停止
格式:
while ((判断条件))
do
程序段
done
例子:
#!/bin/bash
int=1
while (( $int -ge 5))
do
echo $int
let "int++" #$((int+8))
done
注:let命令用于执行一个或多个表达式,变量计算中不需要加上$来表示变量
#!/bin/bash
n = 1
sum = 0
while (( $n -le 10))
do
if [ n%2==0 ]
then
sum = $(( sum + n ))
fi
let n++
done
echo ${sum}
②跳出循环(break和continue):在未达到循环结束条件时强制跳出循环
i)break:允许跳出所有的循环,终止执行后面的所有循环
如下当while后面接冒号:时,表示条件永远为真,就会陷入一个死循环
#!/bin/bash
while :
do
程序体
done
#!/bin/bash
while :
do
echo "input num:"
read num
case $num in
1) echo "A!"
;;
2) echo "B!"
;;
*) echo "stop!"
break
;;
esac
done
ii)continue,跳出循环,它只是跳出当前循环,并不会跳出所有循环,跳转到循环最开始的地方
#!/bin/bash
n = 1
while (( $n -lt 5))
do
echo $n
let $n++
continue
echo "aaaa"
done
③for…do…done
i)格式1:
for (( 初始值;条件;运算语句 ))
do
程序段
done
注意:a.这种写法主要用于数值运算
b.各个组件之间用空格隔开,其实也可以不用这些空格,但建议使用
例子:
#!/bin/bash
for(( n=1; n<=5; n++))
do
echo $n
done
ii)格式2:
for 变量名 in 值1 值2 值3…
do
程序段
done
例子:
for n in 1 2 3 4 5
do
echo $n
done
(21)shell输入、输出重定向
command > file 将输出重定向到file,file中的内容会全部被覆盖
command >> file 将输出以追加的方式重定向到file中
echo "we are family" > 1.sh