linux 内核版本号:
主版号.次版本号.修订号
次版本号为奇数:开发版
次版本号为奇数:稳定版
Linux命令:
ls 查看文件目录
语法:ls [选项/参数]查看路径
-a 查看全部,会将隐藏文件显示
-l 长格式显示
- 普通文件
d 目录
c 字符设备
b 块设备
s 套接字
p 管道文件
- rw------- 1 root root 1310 01-11 11:03 anaconda-ks.cfg
文件类型 权限 硬链接 属主 组
touch 建立空文件或更新文件的日期
rm 删除文件
-r 删除目录
-f 强制删除,不提示
mv 移动文件
-b 覆盖前备份
-f 强制覆盖,不提示
-i 覆盖时提示
-u 若覆盖的文件比源文件旧,不覆盖
路径表示方法:
./ 当前目录
~ 用户的属主目录(家目录)
~用户名 指定用户的家目录
scp 网络拷贝
scp 源地址 目标地址
例:拷贝10.1.1.128机器,/soft/xxx.rpm 文件到本机的/soft下
scp 10.1.1.128:/soft/xxx.rpm /soft/
scp /soft/rhel-5.3-server-i386-dvd.iso 10.1.1.128:/soft/
cp 本地拷贝
cp 源地址 目标地址
ifconfig 查看IP
安装虚拟机:
rpm -ivh 虚拟机软件文件名
获得帮助:man info --help
cat 查看文件内容
cd 目录切换
语法: cd 目标路径
cd 切换到自己的家目录
cd - 返回到上次的目录
cd .. 返回到上一级目录
mkdir 建目录
语法:mkdir 目录名
-p 或建立的目录的上层目录未建立,则自动建立
-m 建立目录时,同时指定权限(如 mkdir -m 755 /root/test2)
vi/vim 的使用
使用模式:命令模式(左下角为空)、插入模式(左下角会显示 “-- 插入 -- ”)、
末行模式(左下角显示 “ :”)
ESC 切换到命令模式
I(i) O(O) 从命令模式切换到插入模式
: 命令模式到末行模式
:w 保存
:wq 保存并退出
:q 退出
:q! 强制退出不保存
yy 复制行
Nyy 复制N行(N代表一数字)
p 粘贴
u 恢复
:e! 放弃所有的更改,重新编辑
useradd 创建用户
语法:useradd [选项] 用户名
-c 添加用户备注信息
-d 强行提它用户家目录位置
-g 指定用户主要组
-G 指定用户次要组
-u 指定用户ID
-s 指定shell
passwd 设置用户密码
语法:passwd [选项] [用户名]
-l 锁定用户
-u 解锁
-S 查看密码状态
-d 删除密码
创建用户时的动作:
1、会在/etc/passwd添加一条
2、在/etc/shadow添加一条
3、在/etc/group添加一条
4、在/etc/gshadow添加一条
5、在/home为用户建立一个家目录,并将/etc/skel/下所有文件拷过来
6、在/var/spool/mail/为用户建一目录
usermod 用户信息修改
语法:usermod [选项] 用户名
-c
-d
-g
-G
-L 锁定用户
-U 解锁用户
-s 修改用户shell
-u 修改UID
su 在当前shell进行用户切换
语法:su [-] 用户名
- 切换用户时,并修改用户环境
练习:添加一个用户bean,设置密码过期周期为30天,密码过期前5天提示警告,
过期3天能登录,如果这3天内不改密码,就永久锁定
userdel 删除用户
语法:usedel [选项] 用户名
-r 删除用户时连同用户家目录也一并删除
groupadd 新建组
语法:groupadd [选项] 组名
-g 指定组ID
-r 指定组ID小于500
gpasswd 管理组
-a 添加用户到组
-d 删除组成员
无选项时,设置组密码
newgrp 登录到组
groups 查看当前用户所属的组
groupdel 删除组
id 显示用户和组信息
users,who,w 查看当前系统登录的用户
write 给当前联机的指定用户发消息
wall 给所有用户发消息
alias 显示设置别名
unalias 删除别名
last 查看登录信息
lastb 查看登录失败的信息
lastlog 查看用户最后登录时间
权限管理
权限分类
权限查看
chmod 设置权限
对象表示:
u 属主
g 开放组
o 其它用户
a 所有用户(u+g+o)
动作表示:
+ 增加权限
- 减去
= 指定
权限表示:
r(4) 读
w(2) 写
x(1) 执行
-R 应用到目录及其子目录中的对象
粘贴位(特权位):
u的s(suid)位 执行时,以属主的身份来执行的
g的s(sgid)位 执行时,以组的身份来执行的
o的t 文件只有属主能删除
chown 修改文件、目录的属主
语法:chown 用户名:组名 文件或目录名
练习:
以root身份在/建一目录test2,复制etc中以p开头的文件到其中
允许其它用户(非root)能在其中建立文件、删除文件,但只能删除自已建立的文件
在/建一目录test3,让tom能在其中有读、写、执行的权限,smith能读、写,但不能执行
mary只能读。以能否创建、删除文件的方式来验证。
chattr 设置文件属性
语法:chattr [选项] 文件名
i 不允许对文件作任何修改
a 只能追加
选项前用“+”表示设置,用“-”表示取消
lsattr 查看文件属性
系统管理
1、hostname 查看主机名
也可临时修改,如果要永久修改的话,要写到配置文件
/etc/sysconfig/network中
2、uname 显示系统信息
-a 全部信息
-r 内核版本
-s 内核名称
3、cal 日历
4、file 查看文件类型
5、ssh 安全的远程登录
语法: ssh username@ip
-X 开启X11传输,能够用图形界面 (x-window)
-x 关闭x11传输,不能用图形界面
也可以通过ssh 远程调用指定的机器的程序
ssh username@ip command
6、init 6 重启
init 0 关机
shutdown -h now 关机
shutdown -r now 重启
7、date 查看设置时间
设置显示格式:date +%Y-%m-%d
网络管理命令
1、ifconfig 查看修改IP
要永久性修改,要修改配置文件
/etc/sysconfig/network-scripts/ifcfg-eth0
改好后,
用service network restart 重启网络服务
禁用网卡:ifconfig eth0 down
启用网卡:ifconfig eth0 up
2、route 查看路由
设默认网关:
route add default gw 10.1.1.1
3、设置DNS
要修改配置文件 /etc/resolv.conf
4、网络服务的管理
service network start 启动服务
service network stop 停止服务
service network restart 重启服务
servcie network status 查看服务状态
磁盘管理
df 查看磁盘状态
mount 挂载磁盘
让其开机自动挂载,要写入/etc/fstab文件中
挂载ISO
mount -o loop /xxx/xxx.iso /xxx
mount -o loop /soft/rhel-5.3-server-i386-dvd.iso /mnt
网络挂载
mount -t nfs 10.1.1.1:/share/rhel_source
挂载CD-ROM
mount -o ro -t iso9660 /dev/cdrom /xxx
mount -a 挂载/etc/fstab中的所有设备
--bind 两个挂载点绑定
mount --bind /home /mnt
--move 移动挂载点
mount --move /mnt /disk11
umount 卸载
umount 设备名/挂载点
fdisk 磁盘分区
n 新建分区
d 删除分区
p 显示、查看分区
l 显示分区类型
t 改变分区类型
m 显示帮助菜单
w 保存
改变分区后,最好 partprobe 同步一下
mkfs 格式化
语法:mkfs -t 文件系统类型 分区
交换(swap)分区:
增加swap
方案一:为系统添加一个swap分区
1、添加一个swap分区
2、用mkswap 将其格式化(mkswap /dev/sda9)
3、swapon 启用swap分区 (swapon /dev/sda9)
4、将其写到/etc/fstab中
/dev/sda9 swap swap defaults 0 0
方案二:做一个swap文件
1、建一swap文件
dd if=/dev/zero of=/opt/swapfile bs=2M count=1024
2、用mkswap将其变为swap可用文件
mkswap /opt/swapfile
3、启用 swapon /opt/swapfile (如果让其开机自动启用的话,可以将其放到
开机自动运行的文件中,如/etc/rc.local)
/etc/fstab
LABEL=/ / ext3 defaults 1 1
挂载的设备 挂载点 文件系统 挂载选项 是否备份 是否进行分区检查
或卷标
练习:
建两个ext3分区,并将他们使用起来
用两种方案增加系统的swap空间,设置好后,以后都能自动启用
修改自己主机名,将IP设为静态,DNS
进程
进程状态:
r 运行状态
s 可中断的睡眠状态
d 不可中断的睡眠状态
t 暂停状态
z 僵尸状态
x 退出状态,进程即将被销毁
ps 查看进程
-e 所有进程
-f 全格式
-l 长格式
-w 宽格式
-u 包括user,pid,%CPU
top 查看进程(能动态显示)
M 按内存占用排序
P 按CPU占用排序
/proc 有当前系统内核信息
pstree 查看进程树
kill 杀除进程
kill 进程号
killall 能杀掉一组同名的进程
killall httpd
pgrep 找具有某一特征名的进程
linux 软件安装
1、rpm
rpm -ivh 包名(以.rpm结尾)
-i 安装
-v 显示附加信息
-h 显示进度条
-q 查询软件信息
单独的q查询本机是否安装了那个包
-qa 查询本机所有安装的软件包
-qpl 查询包的安装路径和文件列表
-qf 查看某个文件属于哪个包
-e 卸载
-F 强制升级
--nodepts 忽略依赖关系
--replacefiles 覆盖现有文件
--force 强制安装
2、src.rpm
方法一:利用rpmbuild --rebuild 将其生成rpm包
注意其输出,会告诉你生成的rpm包会在什么地方
然后,到生成的目录,用rpm -ivh 安装
方法二:用 rpm --rebuild 生成
3、源码包的安装
1、解压 tar -xvf xxx.xxx
2、配置编译项 ./configure (有些软件不需要配置)
3、编译 make
4、安装 make install
4、二进制包的安装 .bin
这种包不需要加装,解压后,直接就可以运行
但是要注意要有执行权限
5、yum 安装(能自动解决软件包的依赖关系)
1、指定软件源(软件仓库)
2、配置yum配置文件/etc/yum.repos.d/rhel-debuginfo.repo
[Server]
name=Server
baseurl=file:///soft/rhel53/Server
enabled=1
gpgcheck=0
3、利用yum来安装软件
yum install 软件包名
yum groupinstall 组名
4、查看软件包
yum list
yum grouplist
5、卸载
yum erase 软件包名
yum remove 软件包名(可用通配符*)
grub
涉及的配置文件:
/boot/grub/device.map
/boot/grub/grub.conf(/etc下用其软链接grub.conf)
有时在排错时经常会改写/boot/grub/grub.conf,让你无法启动
打包、压缩、解压
tar 打包/解包
-cf 打包
-xf 解包
-C 指定解包路径
-z 使用gzip来压缩解压(通常.gz文件加此参数)
-j 使用bzip2来压缩解压(通常.bz2文件加此参数)
-v 显示进度
练习:
1、安装rar解压软件、星际译王词库(放到/usr/share/startdict/dic)
2、安装kernel-module-ntfs-2.6.18-128.el5-2.1.27-0.rr.10.11.i686.rpm、
fuse-2.7.1.tar.gz、ntfs-3g-2009.4.4.tar让linux能支持NTFS读写。
mount -t ntfs-3g /dev/xxx /xxx
bzip2 压缩/解压(注:会删除原始文件).bz2
-z 压缩
-d 解压
-k 保留原始文件
gzip 压缩/解压(注:会删除原始文件).gz
-n 压缩
-d 解压
gunzip 解压(注:解压时会删除原始的压缩文件).gz
zip 解压(不会删除原始文件).zip
linux启动过程:
bios自检-->MRB-->GRUB-->内核加载-->INIT-->
/etc/inittab-->/etc/rc.d/rc.sysinit-->根所运行级别
到/etc/rc.d/rcX.d/运行其下的所有脚本(X代表运行级别的数字如rc5.d)
-->/etc/rc.local-->login
/etc/inittab定义了当前系统运行级别
0 关机
1 root单用户,且不需要密码
2 多用户,无网络服务
3 完全多用户,字符界面
4 保留
5 图形模式
6 重启
runlevel 显示当前系统运行级别
控制系统启动时运行的服务
ntsysv [--level n] 系统服务管理(图形界面)
chkconfig 系统服务管理
--list 显示
--add 添加
--del 移除
on 启用
off 停止
chkconfig vsftpd off --level 234
文件查找
which 查看命令文件的所在位置(只在$PATH中找)
whereis 查看命令文件及其相关文件
locate 查找指定文件,为使用查得更准,可以在查之前
更新系统数据库updatedb
find 查找
语法:find 查找路径 [选项]
-name 按文件名找
-perm 按权限找
-user 按文件属主找
-group 按组找
-type 按类型找
-size 按大小(默认会按块,按字节数字后,加c)
-newer 比某个文件新
-exec 查出后,执行指定命令
-ok 带提示执行
例:find ./ -newer ab -ok rm {} \;
find ./ -newer ab -exec rm {} \;
文件时间:
atime (access time) 每次读时会发生改变
ctime (change time) 改变属性时改变
mtime (modify time) 修改内容时会发生改变,同时会将atime,ctime修改
默认情况下:
ls -l 查看的是mtime
ls -lu 查看的是atime
ls -lc 查看的是ctime
stat 查看三种日期
x-window
服务端设置:
xhost 控制允许显示的客户机
+ ip 允许指定的ip
- ip 从允许的列表中将此ip删除掉
客户端使用:
DISPLAY=10.1.1.125:0 xclock
或:
在本机xhost +
然后:ssh -X 10.1.1.125
xclock
sort 将文本文件排序
-n 数值排序
-t 指定分隔符
-k2 排序关键字
sort -n -t: -k2 s1.txt
wc 统计
-l 行数
-w 字数(单词数)
-c 字符数
磁盘配额
1、挂载磁盘时,加配额选项
vim /etc/fstab
/dev/sda11 /disk11 ext3 defaults,usrquota,grpquota 0 0
2、生成相关配置文件
quotacheck -cavug
-a 扫描所有已挂载的磁盘
-c 创建配额数据
-v 显示执行过程
-u 生成aquota.user用户配额文件
-g 生成aquota.group组配额文件
3、设置用户配额
edquota -u tom
Filesystem blocks soft hard inodes soft hard
/dev/sda11 0 1000 1200 0 0 0
空间限额 文件数限额
4、启用限额
quotaon /dev/sda11
(如要开机自动启用配额,将此语句写到/etc/rc.local)
5、查看配额
repquota -a
quota -u tom 查看指定用户
NFS (Network File System)
主要用于like unix间的文件共享
启动NFS时,要先启动RPC
安装:
服务器:nfs-utils
portmap
安装方法:yum install nfs*
yum install portmap*
验证: yum list | grep nfs
yum list | grep portmap
或: rpm -qa | grep nfs
rpm -qa | grep portmap
客户端: portmap
涉及的服务:
nfs
portmap
NFS服务器配置:
vim /etc/exports
配置文件共两段:
/nfs/ *(ro)
/soft/ *(ro)
共享的目录 开放的用户及权限(实际权限与本地权限有关)
客户端的表示:
* 所有主机
10.1.1.0/24 特定网段
10.1.1.100 特定IP
*.uplooking.com 特定的域
权限表示:
ro 只读
rw 读写
root_squash 把root帐号映射成匿名帐号
no_root_squash 不把root帐号映射成匿名帐号
all_squash 把所有用户映身成匿名帐号
anonuid=xxx 指定匿名账号的uid
anongid=xxx 指定匿名帐号的gid
sync 实时同步数据到磁盘
async 异步数据存放
secure 限制客户端只能从小于1024的TCP/IP
端口连服务器
insecure 允许大于1024端口连服务器
subtree_check 若输出目录是一个子目录,则NFS服务器检查
其父目录权限
no_subtree_check
开机启动
查看是否开机自动启动
chkconfig --list | grep nfs
chkconfig --list | grep portmap
设置开机启动
chkconfig --level 35 nfs on
chkconfig --level 35 portmap on
禁止开机启动
chkconfig --level 345 portmap off
chkconfig --level 35 nfs off
手动启动:
启动:service portmap start
停止:service portmap stop
重启:service portmap restart
启动:service nfs start
停止:service nfs stop
重启:service nfs restart
配好后,启动portmap,nfs服务
service portmap start(restart)
service nfs start
相关操作命令:
1、showmount 查看NFS服务器的共享情况
语法: showmount [选项] NFS服务器名或IP
-a 查看NFS服务器的所有客户连接信息
-d 显示NFS服务器中已被挂载的目录
-e 查看NFS服务器所有的共享目录
2、mount 挂载
mount -t nfs 10.1.1.1:/share/rhel_source /mnt
将NFS服务器上共享的文件挂载到本地
3、exportfs 维护NFS服务器的共享目录
-a 输出在/etc/exports中所有设置的目录
-v 在屏幕上显示
-r 重新读取/etc/exports,并使设置生效,不重启nfs服务
-u 停止共享
4、如何将一个NFS服务的共享目录开机挂载
将portmap设置为开机启动
编/etc/fstab,添加
10.1.1.1:/share/rhel_source /mnt nfs defaults 0 0
5、rpcinfo 查看rpc服务的注册状态
-p 显示所有端口与程序
常见问题:
1、portmap 没有启动
2、注意防火墙
service iptables status(看防火墙状态)
service iptables stop (停用防火墙)
samba(用于linux、windows之间的文件共享)
有两个守护进程:smbd、nmbd
安装:yum install samba
samba-client.i386 客户端包
samba-common.i386 公共包
samba.i386 服务器端
samba-swat.i386
system-config-samba
配置samba服务器
vim /etc/samba/smb.conf
security = user/share 共享方式share可匿名访问
添加共享目录
[mysamba]
comment = linux samba server
path = /share/smb 共享路径
browseable = yes 是否可浏览
public = yes 是否匿名访问
writeable = yes 是否可写
再启动服务:
service smb start
测试配置文件是否有语法错误:
testparm
如果采用的是security = user这种模式,则需要
1、为smb建linux用户 useradd samba
2、将此用户加到samba服务器中 smbpasswd -a samba
客户端使用:
share方式:
smbclient -L //10.1.1.125 查看共享
mount -t cifs //10.1.1.125/mysamba /mnt2
user方式:
smbclient -L //10.1.1.125 -U samba 查看
smbclient //10.1.1.125/soft -U samba 登录,象FTP那样使用
mount -t cifs -o username=samba //10.1.1.125/soft /mnt2
练习:
1、在/建share目录,将其共享出去,让10.1.1.x1只读,
10.1.1.X2能读写(X1,X2为自已指定的IP)
2、搭建一个nfs服务器
/share/music 10.1.1.0/24网段下所有人都可只读访问,把管
理员映射成匿名用户
/share/ftp 10.1.1.X可进行读写,其它用户只读,并把所有
用户映射成匿名用户
/share/www 所有人只读,所有用户映射成uid=501,gid=501
3、用share和user方式,搭建一个samba服务器
vsftp
ftp有两种工作模式:主动模式(port模式)和被动模式(pasv模式)
主动模式下:服务器使用20(数据端口)、21(控制端口)端口
被动模式下:服务器使用21(控制端口)、和一个随机端口(数据端口)。
安装:
需要的软件包:vsftpd
安装:yum install vsftpd
配置服务器:
vim /etc/vsftpd/vsftpd.conf
anonymous_enable=YES 是否允许匿名登录
anon_root=/ftp 匿名登录后的FTP根目录,
没设置时/var/ftp
local_enable=YES 是否允许本地用户登录
local_root=/ftp 本地用户登录后的FTP根目录
没设置时在自己的家目录
write_enable=YES 是否允许本地用户可写
chroot_local_user=YES 是否将用户锁定在ftp家目录中
anon_upload_enable=YES 是否允许匿名上传
anon_mkdir_write_enable=YES 是否允许创建目录
anon_other_write_enable=YES 是否允许其它的写(删除)
anon_umask=022 上传的权限掩码(777或666来减)
anon_max_rate=30000 限速,单位Byte/s
local_umask=022 本地用户上传的权限排码
local_max_rate=60000 本地用户限速
max_clients=3 客户端的最大连接数
max_per_ip=2 每个IP的最大连接数
pasv_enable=YES 支持被动模式
pasv_max_port=10240 被动模式的可用的最大端口号
pasv_min_port=1024 被动模式的可用的最小端口号
访问控制:
/etc/vsftpd/ftpusers 此文件中的所有用户不能登录FTP
/etc/vsftpd/user_list 此文件与下面设置有关
userlist_enable=YES 是否启用user_list
userlist_deny=YES 为YES时,不允许user_list中的用
户登录ftp,为NO时,只允许
user_list中的用户登录
会话设置:
idle_session_timeout=600 空闲会话超时
data_connection_timeout=600 数据传输超时
启动服务器:
service vsftpd start
apache
需要安装的包:httpd、httpd-devel、httpd-manual
安装:yum install httpd*
服务器配置:
vim /etc/httpd/conf/httpd.conf
Listen 80 监听端口
User apache 运行的身份(用户)
Group apache 运行的身份(组)
ServerAdmin root@localhost 管理员邮箱
ServerName www.example.com:80 服务器默认绑定的域名
DocumentRoot "/var/www/html" 网站页面存放路径
DirectoryIndex aa.html index.html 定义网站首页
去掉apache自己的测试页:
方法一:将/etc/httpd/conf.d/welcome.conf 改后辍名
方法一:将/var/www/error/noindex.html 改名
服务器做多个网站(虚拟主机)
方案一:基于IP
1、添加一个IP
ifconfig eth0:0 192.168.1.125 netmask 255.255.255.0
2、vim /etc/httpd/conf/httpd.conf
NameVirtualHost 10.1.1.125:80
NameVirtualHost 192.168.1.125:80
DocumentRoot /www/163
ServerName www.163.com
ErrorLog logs/163.com-error_log
CustomLog logs/163.com-access_log common
DocumentRoot /www/sina
ServerName www.sina.com
ErrorLog logs/sina.com-error_log
CustomLog logs/sina.com-access_log common
确保DocumentRoot及其下面的文档存在
3、重启服务
4、访问
http://10.1.1.125 --->163.com
http://192.168.1.125 --->sina.com
方案二:基于端口
1、vim /etc/httpd/conf/httpd.conf
Listen 80
Listen 81 -->添加滥听的端口
Listen 82
NameVirtualHost 10.1.1.125:80
NameVirtualHost 10.1.1.125:81
DocumentRoot /www/163
ServerName www.163.com
ErrorLog logs/163.com-error_log
CustomLog logs/163.com-access_log common
DocumentRoot /www/sina
ServerName www.sina.com
ErrorLog logs/sina.com-error_log
CustomLog logs/sina.com-access_log common
方案三:基于域名
1、vim /etc/httpd/conf/httpd.conf
NameVirtualHost *:80
DocumentRoot /www/163
ServerName www.163.com
ErrorLog logs/163.com-error_log
CustomLog logs/163.com-access_log common
DocumentRoot /www/sina
ServerName www.sina.com
ErrorLog logs/sina.com-error_log
CustomLog logs/sina.com-access_log common
2、vim /etc/hosts
10.1.1.125 www.163.com 163.com
10.1.1.125 www.sina.com sina.com
练习:1、做一个能让匿名用户上传下载的FTP站点,限制最大下载速度为50K,
最大用户连接数为5个,上传后的文件权限为644。
2、架设一FTP服务器,关闭被动模式的连接,只允许mary和ftp两个用户
连接,空闲会话时间120秒。
3、搭建三个网站,用基于IP、基于端口、基于域名三种方式分别实现。
shell编程
shell:是一个命令解释器,侦听用户指令、启动这些命令所指定的进程,
并将结果返回给用户(交互式shell)
同时shell也是一种程序设计语言,它有变量、关键字,各种控制语句
有自己的语法结构,利用它可以编写功能很强、代码简短的程
序(shell脚本)
shell很多,cat /etc/shells查看当前支持的shell
echo $SHELL 查看当前使用的shell
bash的初始化过程:
用户登录linux时,会依次执行以几个文件:
/etc/profile --> ~/.bash_profile --> ~/.bashrc
--> /etc/bashrc
其中/etc/profile 会调用/etc/profile.d下的所有.sh
~/.bash_logout 退出时会执行的
~/.bash_history 记录了用户最近执行的命令
关于历史记录的操作:
history 显示历史记录
! ! 执行上一个命令
!n 执行第n号的历史记录
!-n 执行历史中倒数的第n条命令
!command 执行历史记录中最后一个command
与history有关的变量
HISTFILE 历史记录文件
HISTFILESIZE 历史记录文件中保存的历史记录数
HISTSIZE 退出时写到HISTFILE中最大记录数
如何不写历史记录?
一次执行多条命令:
1、无条件执行
将所有命令写在一行上,用;将要执行的命令分开
用()括起来时,会在子shell中执行,执行完时子shell会关闭掉
父shell不受影响。
2、有条件执行
后一条的执行受前一条的影响
&& 逻辑与,第一个执行成功时,才执行第二个
| | 逻辑或,第一个执行不成功时,才执行第二个
重定向:>
0 正常的输入
1 正常的输出
2 错误输出
返回值:
linux每个进程执行完退出后,都会返回一些信息给父进程,叫返回状态,
用整数表示,范围一在0-255之间。0表示执行成功,非0的话,就表示有
某种形式的错误。
如何查看返回值状态?
返回值的保存有一个变量 ?,用于保存上次执行的返回值。
通过 echo $? 可查看上次执行成功与否
命令行替换:
! 历史替换(前面已经讲过)
{} 字符展开,每次一个
如:mkdir chap{01,02,03,04}
mkdir -p chap{01,02,03,04}/{html,text}
~username 用户的家目录
$或${} 变量替换,将变量的值取出来,也叫变量解释
$(( )) 算术替换,用于算术运算,不过只支持整数
命令行上的+、-、*、/没有传统的数学意义
echo ((1+2))
` `或$() 命令替换,取命令执行结果
*、? 通配符
[abcd] 方括号中的任一个
[^abc] 不在方括号中的任一个
shell变量
shell变量分类:环境变量、局部变量。
环境变量:能被子shell继承
局部变量:只存在于创建它的shell环境中
有些把shell变量分为4类,将环境变量细分为:普通环境变量、
位置参数、特定变量参数。
内置环境变量:
$? 最近命令执行的退出状态
$- 当前启用中的shell选项标记
$$ 当前shell进程ID
$PPID 当前shell父进程的ID
$! 最新后台命令的进程ID
$0 当前执行的进程名(程序名)
$1-9 程序接收的参数
$# 位置参数的数量
$* 所有位置参数的内容
变量定义:
为变量名赋一个值即定义了。如A=5
注意:
1、=两边没有空格。
2、值含有空格时,要用“”括起来(如B=“hell words”)
3、如果要定义的是环境变量,前面加export(如export C=3)
4、shell是一弱类型语言,变量无严格的数据类型。具体类型取
决于当时语义环境。如 a=123;echo $a"bdc";echo $((a+5))
5、变量名约定俗成为大写。
变量解释:$ (必要时要使用${}来界定变量范围)
A=apple
echo "how are you" > $A_ode.txt
echo "how are you" > ${A}_ode.txt
比较其区别?
变量删除 unset
unset A
创建一个shell脚本:
vim firtsh.sh
#!/bin/bash 指定shell的解释器
# 注释
hell="Hello! how are you"
echo $hell
运行shell
1、设置其可执行权限 chmod 755 firstsh.sh
2、输入文件名直接运行(./firstsh.sh)
echo 回显
格式:echo [选项] 字符串
-n 不换行
read 读数据,并放到指定的变量中
if 条件分支
1、if [ 条件 ]
then
commands
fi
执行流程:判断[ ]中的条件是否成立,成立的话,
执行then-if之间的命令,不成立的话,就不执行。
2、if [ 条件 ]
then
commands
else
commands
fi
执行流程:判断[ ]中的条件是否成立,成立的话,
执行then-else之间的命令,
不成立的话,执行else-fi之间的命令。
比较运算:
数值比较:
-eq 等于
-ne 不等于
-gt 大于
-ge 大于等于
-lt 小于
-le 小于等于
字符比较:
= 等于
!= 不等于
-z 是否为空
-n 非空
\> 大于
\< 小于
文件测试
-b file 若文件存在,且是一个块设备文件,返回真
-c file 若文件存在,且是一个字符设备文件,返回真
-d file 若文件存在,且是一个目录,返回真
-e file 判断文件是否存在
-f file 若文件存在,且是一个普通文件,返回真
-r file 文件是否存在,且可读
-w file 文件是否存在,且可写
-x file 文件是否存在,且可执行
file1 -nt file2 file1是否比file2新
file1 -ot file2 file1是否比file2旧
多条件的表示:
[ condition1 -a condition2 ]
等介于 [ condition1 ] && [ condition2 ]
[ condition1 -o condition2 ]
等介于 [ condition1 ] | | [ condition2 ]
不可以
[ condition1 && condition2 ]
但是,可以
[[ condition1 && condition2 ]]
练习:1、写一个程序,输入三个数,显示其中较大的那个数。
echo "enter the first number of the three:first"
#read v1
#echo "enter the second number of the three:second"
#read v2
#echo "enter the third number of the three:third"
#read v3
#max=$v1
#if [ $v1 -lt $v2 ]
# then
# max=$v2
#fi
# if [ $v1 -lt $v3 ]
# then
# max=$v3
# fi
#if [ $2 -lt $v3 ]
# then
# max=$v3 n=3
#fi
#echo "the biggest one is the $n one $max"
2、写一个程序,判断参数文件是否存在,如果存在的话,显示其
内容如果不存在,则显示“文件不存在”
!#/bin/bash
clear
echo ""
if [ $# -ne 1 ]
then
echo "can shu wrong"
fi
if [ -r $1 ]
then
echo "file cun zai nei rong ru xia "
cat $1
else echo "$1 not exsit"
fi
3、写一个程序myservice.sh 模拟service 的执行过程
输入myservice.sh xx start (xx为输入的任一服务名)
显示 xx start ...
输入myservice.sh xx stop
显示 xx stop ...
输入myservice.sh xx restart
显示 xx restart ...
只后一个参数只接收start,stop,restart输入其它值是提示错误
!#/bin/bash
clear
echo ""
if [ $# -ne 1 ]
then
echo "can shu wrong"
fi
if [ -r $1 ]
then
echo "file cun zai nei rong ru xia "
cat $1
else echo "$1 not exsit"
fi
4、写一个程序判断apache是否启动,如果没有启动,则启动它
已启时给一个提示,apache服务已启动。
#!/bin/bash
clear
a=`ps -ef | grep http| wc -l`
if [ $a -lt 2 ]
then
echo "the apache is stop"
else
echo "the apache servic is open!"
fi
变量运算
字符运算
字符连接:
将变量直接按顺序输入,会自动连接起来
取字符串长度:
${#STR} expr length $STR
例:A="ALSKDFKLASDFJ“
echo ${#A}
或 expr length $A
取子串:
${STR:n} n表示位置,忽略前n个字符
${STR:n:m} 忽略前n个,取m个
${STR:(-n)} 取最后的n个
${STR:(-n):m} 从最右边的n个开始取m个
删除操作:
echo ${STR#*r} #从左到右 ## 到最右 * 删除
*后面的字符表示删除到哪里
echo ${STR##*r}
echo ${STR%/*} %从右到左 %% 到最左 * 删除
从右到左删除,删除的字符要在*前
数值运算
$[ ]
A=3
B=2
echo $[$A+$B]
$(( ))
echo $(($A*$B))
echo $(($A+$B))
cut 剪切文件(取其中的某一段)
格式:cut [选项] [文件名]
-c 字符
-f 字段
-d 字段分隔符
cut -d: -f1,2,7 /etc/passwd | head -5
case 多分支
语法:
case var in
pattern1)
commands
;;
pattern2)
commands
;;
*)
commands
;;
esac
执行流程:
判断var值与下面哪个pattern匹配,如果匹配的话,就执行其下的
commands,如果不匹配的话,有*,则执行*下的command
如果不匹配,也没有*,就什么都不做
for 循环
for var in word1 word2 word3 ... wordn
do
commands
done
C式for 循环
for ((var=x;condition;changevar))
do
commands
done
如:for ((i=1;i<10;i++))
do
commands
done
while 循环
格式:while [ condition ]
do
commands
done
while [ $n -lt 101 ]
循环嵌套:
循环中包含循环,一个循环作为另一个循环的一部分。
练习:将/etc/下及其子目录下的所有conf文件,复制到/test中,并按顺序改名。
第一个被复制的的为xx.conf xx.conf1 xx.conf xx.conf2
#!/bin/bash
#
n=1
for i in `find /etc/ -name "*.conf"`
do
a=`basename $i`
b=/test/$a$n
n=$[$n+1]
cp $i $b
done
删除/home下所有的空文件,并给出删除文件的名字,和最后的统计,共删
了多少个
1 #!/bin/bash
2 #
3 files=`find /home -size 0`
4 lines=`find /home -size 0|wc -l`
5 echo "一共有$lines空文件需要删除"
6 echo "删除的文件列表:"
7 for file in $files
8 do
9 echo $file
10 rm -f $file
11 done
~
用while写一个求100内的奇数和
在/test下建三个文件,分别为111、222、333,每隔10秒钟,进行改名
111-->222 222-->333 333-->111
使用第四个变量来作为中间变量,用mv命令,sleep为时间休止命令
until 循环
直到型循环,直到条件满足就不再进行循环,与while刚才相反
格式:until [ condition ]
do
commands
done
执行流程:判断条件是不是不成立(或者讲返回值是不是非0),
不成立就执行循环体,条件成立了,就退出循环。
循环控制
break 跳出循环,中止当前循环
continue 跳过余下的语句,直接进行到下一轮
循环输出的处理
可在done末尾添加处理命令来实现(见/sh/3_3.sh)。
数组:
具有相同名字,不同下标变量的集合。
数组定义:
方法一:与普通变量一样,直接赋值。
值用()括起来,值之间用空格分开。
如:mytest=(one two three four five)
如值含有空隔,要用“”将值括起来
方法二:直接给元素赋值
mytest[0]=a
mytest[1]=b
mytest[2]=c
方法三:将方法一、二综合起来了
mytest=([0]=abcd [1]=df [2]=423)
方法四:用declare定义
declare -a mytest=(5 6 7 8)
declare不但可定义数组,还可定义其它变量
-a 定义数组
-f 定义函数
-i 定义为整数
-r 定义变量为只读
数组使用:
数组使用主要是使用其中的元素,使用时用:数组名[下标] 的形式
如果直接用数组名的话,默认取第一个元素。元素下标从0开始。
显示所有变量:echo ${mytest[*]}
即下标用*表示
获取数组元素个数:echo ${#mytest[*]}
删除数组:unset 数组名
会将整个数组删掉
删除数组元素:unset ${mytest[2]}
数组复制:aa=(${bb[*]})
函数:
shell脚本编程中经常会用到一些相同的代码,如果这些代码比较短小的话
没太大的问题,但经常用到一些大段的相同代码,就会感到很麻烦了。
这时shell就引入的函数。函数可以理解成具有名字的代码块。调用时只要
输入函数名即可。
函数定义:
funcation funcation_name() {
commands
}
funcation_name (){
commands
}
函数删除:
unset funcation_name
使用函数:
直接输入文件名即可。有参数的话,给定参数。
但要注意:定义必须要在使用之前,即先定义,后使用。
练习:写一程序打印 * * * * *
* *
* *
* *
*
打印一个等腰三角形
*
***
*****
*******
*********
定义一个函数,第一个参数指定打印的字符,第二个参数决定打印的个数
Aogu 于 2010-02-02 14:21:14发表:
不容易呐
zhangbohtz 于 2010-02-02 12:49:54发表:
其他的内容在学习中,感谢这里的人为了公同的linux学习铺平道路,作为新手我也想为之作出点贡献,这些内容是关于新手入门的一些系统操作,不同的人会有不同的理解,请勿商业用途,如有删改请一并发表,方便大家学习只用!谢谢