useradd zhangsan
passwd zhangsan
visudo往/etc/sudoers文件中添加zhangsan
#visudo 找到如下的行 root ALL=(ALL) ALL
往该行下面添加zhangsan zhangsan ALL=(ALL) ALL
一些根文件系统中较为重要的二级目录:
①/boot: 存放系统引导时所需的文件,包括Linux内核以及引导装载程序(boot loader)等。
②/bin(binary): 存放可执行程序。
③/dev(device): 存放设备文件和特殊文件。
④/etc: 存放系统配置文件。
⑤/home: 普通用户的主目录所在位置。
⑥/lib: 存放基本共享库文件和内核模块。
⑦/mnt(mount): 用于为需要挂载的文件系统提供挂载点。
⑧/proc(process): 存放与内核和进程有关的信息。
⑨/root: 根用户的主目录
⑩/tmp(temporary): 存放临时性文件
⑪/usr(user): 存放可共享的只读数据文件
⑫/var(variable): 存放各类数据文件
ls
(list)命令
列出目录的内容,包括文件和子目录的名称
pwd(print working directory)命令
显示当前工作目录
cd (change directory)命令
stat命令
获取某个文件的基本信息
touch命令(示例2.6)
更新一个文件的访问和修改时间,如果没有对应文件则新建该文件
mkdir(make directories)命令
-p
:若所建目录的上层目录不存在,则一并建立mkdir -p ./parentdest/test # 如果parentdest没有,一并建立
mv(move)命令(示例2.7)
移动文件或目录;更改文件或目录的名称
mv memo.1 memo.new # 将memo.1改名为memo.new
mv memo.1 memo.2 /home # 将两个文件移动到/home目录下
mv /home/test /home/dest # 将/home/test移动到/home/dest目录下
cp (copy)命令(示例2.8)
cp [选项] 源文件和目录 目标文件/目录
-f
:强制赋值文件或目录
-i:覆盖目标文件前需要确认
-n:不覆盖已经存在的目标文件
-p:复制文件时也复制文件的属性如 读取权限
-r
:递归复制目录
-b
(backup):若存在同名文件,复制前先备份原来文件
cp file /home # 将file复制到目录里
cp -r /home/test /home/dest #将/home/test 复制到 /home/dest目录下
rm(remove)命令(示例2.9)
rmdir命令(示例2.10)
从1个目录中删除一个或多个目录。删除目录时,必须对该目录的父目录具有读写权限,目录被删除之前应该是空目录。
tar
建立还原备份文件的工具程序。(打包)
-c create
创建新的备份文件f 备份文件
-t --list
列出 备份文件的内容-v --verbose
显示指令执行的过程-x --extract或--get
从备份文件中还原文件# 将当前目录的文件m.1、m.2、m.3备份到memo.jar中
jar -cvf memo.jar m.1 m.2 m.3
# 将上面几个文件还原
tar -xvf memo.jar
cat(concatenate)命令
把多个文件连接后输出到标准输出(屏幕)或者加“ > 文件名”输出到另一个文件
常用选项:
cat file1 file2 #同时显示两个文件的内容
cat file1 fil2 > file3 #将1、2合并输出到file3
cat > file # 从键盘输入信息到file中
more命令
显示文本文件的内容,一次显示一屏满屏之后停下来,可按如下键继续:
常用选项:
more +55 file #从55行之后开始显示
more -5 +/China file # 从China之后开始
tail命令
查看一个文件的末尾若干行,默认10行。如果给定的文件不止一个,则在显示的每个文件前面加一个文件名标题。
tail -n5 file #显示5行
tail -c10 file #显示10字节
wc(word count)命令(示例2.12)
统计给定文件的 字节数、字数、行数。
wc -cwl file #显示行数、字数、字节数
find命令
用于查找符合条件的文件和目录。
grep命令
文本搜索工具,在文本文件中查找指定模式的词或短语,并把匹配的行打印出来。
grep apple fruit # 在fruit中查找包含applr的行
grep t$ fruit # 显示fruit中以t结尾的行
date命令:查看修改最近时间
who命令:列出当前登录用户
shutdown命令:关闭-h重启-r
clear命令
echo命令:在终端上显示一行文本内容
man(manual)命令:显示命令的说明手册(例如:cat --help可以快速查阅帮助)
history命令:查看shell命令的历史记录
alias命令:显示系统中所有命名别名
命令模式
输入vi [文件路径],如果文件不存在则会创建。
编辑模式
末行模式 输入“:”
按字移动光标
按句子和段落移动光标【左括号向左移、右括号向右移】
按行移动
屏幕内移动
命令模式下:
x/X:删除当前/光标左边 字符
dd:删除当前行
*
表示任意长度的任何字符
ls /etc/*.conf
?
表示任意一个字符
[] - !
指定一个符号的取值范围,可以用!取反
# 列出以a或b或c开头的配置文件
ls /etc/[abc]*.conf
ls /etc/[a-c]*.conf
ls /etc/[!d-z]*.conf
分号;
隔开多条命令并使他们能够连续执行
&
:指定当前命令在后台执行(用户可以继续输入下一个命令)
#后台执行,执行完在前台提示
cp file /tmp/filetmp &
转义符号\
(原本通用符号和特殊符号被解释为某种含义和功能,要表示为本身的话要用转义字符)
使用gerp举例
grep [选项] '模式字符串 ’ 文件列表
输出重定向
>
重定向文件附加输出重定向
>>
重定向文件date > record # 将当前日期信息重定向输出到文件record中
格式:命令以及选项参数 <
重定向文件 (手动输入ctrl+D结束)
附加输入重定向:(利用他可以在输入结尾附加一个标识标识结束输入)
<<
结束输入标识# cat获取file内容,重定向输出到file2
cat < file > file2
# 当输入stop,cat随机停止执行
cat << stop > file
# 多个输入文件合并
cat file1 file2 > file3文件
格式:命令及其选项参数 2>
重定向文件(如果是附加为 2>>
)
#lsls不存在
lsls 2 >> err
管道可以把一系列命令连接起来,即:第一个命令的输出hi通过管道传给第二个命令作为他的输入…
格式:命令1 |
命令2
# 由于/etc 目录里的文件和子目录很多,可以用管道将列表结果传给more显示分页
ls /etc | more
引号:
''
:由单引号括起来的都作为普通字符""
:$ \ ' '
这四个字符是特殊字符# 1. 利用ls命令查找/root下以a, b, c, d开头的文件。
sudo ls /root | grep "^[a|b|c|d]"
# 2. 获得系统当前时间并将结果保存在文件file中。
date > file
# 3. 列表显示/tmp目录下的所有文件信息,并将结果保存在文件allfile中。
ls -l /tmp > allfile
# 4. 启动vi编辑器,新建文本file,写入信息“this is a test”后保存退出。利用附加输出重定向在文本file末尾增加重复写入信息“this is a test”。
cat > file << "end"
echo “this is a test” >> file
# 5. 利用cat命令以及重定向功能向文件file输入信息“this is a test”。
cat > file << "end"
this is a test
end
# 6. 利用cat命令将文件/etc/fstab及文件/etc/inittab合并为/root/mergefile。
cat /etc/fstab /etc/inittab > /root/mergefile
# 7. 利用ls命令递归显示/etc目录下的所有文件信息,要求分屏显示。
ls -la /etc/ | more
#8. 利用管道功能和who命令获取所有关于root用户的在线登录信息。
who -H | grep root
#9 利用history读取命令的历史记录,将所有包含rm命令的历史记录过滤出来。如果没有相关历史就应先自行练习rm命令,注意需要与一些其他命令如rmdir等相区分。过滤结果保存在rmrecord文件中,要求在文件的末尾附上过滤的时间和日期。
history | grep "rm" > rmrecord.`date "+%Y%m%d-%H%M%S"`
# 10. 根据综合实训案例3.3,实现对系统登录用户信息的过滤,过滤条件可以是IP地址或登录时间等。
ip过滤
who -H -T | grep
时间过滤
按终端属性过滤
who -H -T | grep
用户组群管理:
/etc/group:用户组群的基本信息
组群名称 :组群密码:组群id:组群用户列表
/etc/gshadow:存储用户组群汇总与安全有关的基本信息(/etc/passwd的影子文件,存用户的加密口令)
把 /etc/passwd 和 /etc/shadow理解为两张数据表,表里每一行对应的是一个用户账号。那么所有的都是增删改查。
useradd
:添加一个用户账号(需要有根用户权限)
-g
:已存在一个组,新增用户要加入的主要组-G
:已存在一个组,新增用户要加入的附件组-d
:指定用户主目录useradd -g student #指定用户属于student组
举例
passwd
命令:设置密码(只有root用户可以)
passwd
[选项] [用户]
举例:
设置的密码会直接显示在屏幕,这种方法主要用于设置默认密码
chage命令:查看或设置用户账号的有效期
chage [选项] [用户名]
重要选项:
举例:
usermod
命令:修改用户的账号设置、用户属性。例如用户ID、用户组、用户主目录、Shell、账户过期日期
-d:修改用户主目录
-e expire用户过期日期
-g:用户组名
-G:组列表
usermod -G groupname user #将用户user添加到新建组群中
-s:用户登录Shell
-u uid
usermod
[选项] [用户名]
id
命令
查看用户账号的UID、GID以及所属组群等信息
userdel
命令:删除用户账号
userdel [选项] [用户名]
groupadd
命令:增加一个用户组群
-g:该选项后面需给出数字参数,用于指定新建组群的GID。
groupmod
命令 (修改指定组的信息)
-g:该选项后面需给出数子参数,用于指定组群的GID。
-n( name):该选项后面需给出名子参数,用于设置组群的新名称。
groups
命令 :查看用户所属的所有组群
groupdel
命令:删除组群
可以用su
命令切换为根用户,操作完之后使用exit
命令重新切换回原用户,或者普通用户切换要密码
由于执行su
命令还需要输人用户密码,当普通用户需要利用su
命令切换为根用户并执行管理操作时,还需要提供根用户密码才能进行操作。然而这样显然并不利于根用户密码的保护和管理。更为稳妥的方法是让普通用户直接使用sudo
命令执行某个管理操作,此时只需输入普通用户的密码即可。不过作为安全保护机制,普通用户在使用sudo
命令之前
必须由根用户通过visudo命令编辑"/cc/sudoersH相关命令的使用方法。"执行权限.否则普通用户是不能使用sudo
su
(substitute user)命令:切换用户visudo
:调用vi编辑/etc/sudoers文件sudo
:以root用户执行命令操作100 道 Linux 笔试题笔记(四)31-40_暮雨橙海的博客-CSDN博客_使用ln命令可生成一个名为old
chown
:改变文件或目录访问权限(所有者)
chown [选项] [用户][:[组]] 文件
chgrp
:改变文件所属的用户组(组ID、组名)
chgrp [选项] 所属组 文件或目录
crontab
tr
用于转换删除字符
swap为交换分区,也就是虚拟内存
free
以显示当前系统未使用的和已使用的内存数目crond
系统每分钟会处理一次计划任务
扩展:Linux下各种查找命令(find, grep, which, whereis, locate)
https://blog.csdn.net/wzzfeitian/article/details/40985549
netstat
显示Linux系统用户数:wc --lines /etc/passwd
**/etc/mtab文件的作用:**记载的是现在系统已经装载的文件系统,包括操作系统建立的虚拟文件等;而/etc/fstab是系统准备装载的
**etc/fstab文件的作用 :文件系统挂载表,用于管理文件系统信息。开机的时候设备与入口对应关系 开机自动挂载列表。**记录了计算机上硬盘分区的相关信息,启动 Linux 的时候,检查分区的 fsck 命令,和挂载分区的 mount 命令,都需要 fstab 中的信息,来正确的检查和挂载硬盘。
(1)软连接可以跨文件系统,硬连接不可以
(2)硬连接不管有多少个,都指向的是同一个I节点,会把结点连接数增加,只要结点的连接数不是O,文件就一直存在不管你删除的是源文件还是连接的文件。只要有一个存在文件就存在。当你修改源文件或者连接文件任何一个的时候,其他的文件都会做同步的修改。软链接不直接使用i节点号作为文件指针,而是使用文件路径名作为指针。所以删除连接文件对源文件无影响,但是删除源文件,连接文件就会找不到要指向的文件。软链接有自己的inode,并在磁盘上有一小片空间存放路径名。
(3)软连接可以对一个不存在的文件名进行连接。
(4)软连接可以对目录进行连接。
一切皆文件。
ls
命令使用 的文件类型代码
普通文件 | - |
---|---|
目录 | d |
字符设备文件 | c |
块设备文件 | b |
符号链接文件 | l |
套接字 | s |
管道 | p |
普通文件
普通文件包括了文本文件、二进制文件等。文本文件可通过cat
命令或vim
编辑器等工具直接访问。可执行程序,图形文件等均属于二进制文件;例如前面已经介绍过的 which
命令可以查看cat等shell命令作为二进制文件在系统中的存放位置。
# 查看shell命令的存放位置,利用file命令可以查询“/bin/cat”文件的具体信息
$ which cat
$ file /bin/cat
还有的二进制文件是特殊数据类型。如:"/var/log/wtmp/"
和"/var/log/btmp"
,他们需要last和lastb命令读出文件中的信息。
目录
属于特殊文件;
记录了 它内部 所有文件的属性信息。
设备文件
Linux系统采用设备文件统一管理硬件设备,从而将硬件设备的特性及管理细节对用户隐藏起来,实现用户程序不需要关心设备的硬件细节,只需要通过统一的文件访问操作接口即可实现对硬件设备的使用。
这也是“一切皆文件”这句口号最为突出的体现。
在Linux中,设备可分为字符设备和块设备,对应地有字符设备文件和块设备文件。字符设备和块设备的区别在于:
【示例7.5】鼠标设备文件。鼠标属于典型的字符设备,其设备文件存放于“/dev/input"下。示例显示结果中, mouse0-3对应于第1~4个鼠标设备.而mice则对应于通用:usb鼠标设备。
【示例7.6】硬盘设备文件。硬盘属于典型的块设备。每个硬盘在“/dev”目录有对应的设备文件。硬盘按接口类型可分为IDE接口和SCSI接口,使用IDE接口的硬盘其设备文件为hda , hdb等,而使用SCSI接口的硬盘其设备文件命名为sda , sdb 等。实际使用中视需求而定,可将硬盘的存储空间划分为若干个区域,每个区域即被称为硬盘分区。对于已经分区的硬盘,其中的每个硬盘分区为一个独立的设备文件。如下示例结果显示,SCSI 接口硬盘sda中包括了sdal和sda2 两个分区。
blkid (block id)
:查找/打印块设备的属性
-p(probe)
: 需要给出设备名称作为参数,用于探测设备的所有基本信息,包括UUID、文件系统类型。U(UUID)
给出设备文件名称,用于读取设备 UUID链接文件
【图解】一文读懂软硬链接
链接文件指向某个实际的目标文件。
硬链接(hard link):实际则是目标文件的一个副本
实际上,我们在用户界面看到的所有文件(包括目录、快捷方式)全都是硬链接,它们都指向了文件系统的文件索引节点(
inode
)
inode
指向磁盘中的实际文件数据,它的数据结构中有一个硬链接数
inode
节点号的多个文件互为硬链接文件;符号链接 | 软链接(Symbolic Link):记录目标文件的所在路径
命令:【默认创建硬链接文件】
ln [选项] 目标文件路径 链接文件路径
-s(symbolic)
建立符号链接touch target #先建立一个目标文件
ln -s target symtarget #symtarget为链接文件
ls -l symtarget
(1)文件所有者owner
(2)属组成员group
(3)其他用户other
rw-
r--
r--
读r
写w
执行x
文件的权限还可以用数字表示:
4
2
1
这样"rwx"
就可以表示为7。即4+2+1 = 7
如图:文件权限的数字表示
讨论目录的访问权限设置:
ls
等命令获取目录中的文件列表:起码需要有读
权限,但需要有执行
权限配合,否则仍然无法获取详细的文件列表信息。cd
等命令进人目录:需要有执行
权限。但是如果没有读
权限,仍然不能列出目录中的文件。touch
等命令在目录中创建文件:需要有写
权限。但是如果没有执行
权限,同样不能创建文件。由以上讨论可知,如果文件的拥有者想对属组成员或其他用户开放共享目录及其文件,但又不想在该目录下创建文件,则需要设置“r-x"
权限,这正是目录权限的默认设置。
【示例7.11】查看系统为文件及目录攻置的默认权限。
默认权限的设置与系统的umask
值有关。可以通过umask
命令查看当前系统的umask
设置:【查出来发现为0022】
其中第一位数字称为粘着位( stick bit
),而后三位是我们更为关心的,它们是一种掩码, 用表7.2可以翻译为“----w--w-”
。文件被创建后,如果该文件是目录,由于它需要被打开访问,因此它将有初始权限“rwxIwxrwx
”,而如果该文件并非目录,则它将具有的初始权限为"rw-rw-rw-
”。系统将使用umask设置默认权限。
(1)目录文件:初始权限“rwxrwxrwx”去掉“----W–w-”,结果默认权限为“rwxT-xr-x”。
(2)普通文件:初始权限“rw-rw-rw-”去掉“----w–w-”,结果默认权限为“rw-I–r–”。
chmod [选项] 模式 文件路径
设置文件的权限
有两种模式可供选择
chown [选项] 所有者[群组] 文件
功能:设置文件所有者及其所属组群
# 设置newfile文件拥有者为study
chown study:study newfile
# 修改newfile所属组群为testuser
chown :study newfile
chgrp 组群名 文件
设置文件所属 组群
touch studyfile # 默认为root组群
chgrp study studyfile #修改studyfile文件的组群为study
在Linux中的文件查找可分为快速查找和完全查找两种。
快速查找由于只在数据库中检索,因此查找速度很快,适合于对一些重要文件的定位,相关命令有前面介绍过的which命令, which命令用于查找某个命令的执行文件路径,这里另外介绍whereis命令,它能对一些特定的文件进行快速查找。
完全查找是指在整个文件系统范围内查找文件,因而查找速度较慢,但能够完整地找出所有符合查找条件的文件。对于完全查找,下面介绍find命令供读者使用。
whereis
:快速查找关于某个命令的相关特定文件(包括目录)
-b(binary)
-m(manual)
:只查找与命令有关的说明手册文件-s(source)
:只查找与该命令有关的源代码文件find [查找路径] [选项] [参数]
对某些特定文件(包括目录)进行完整查找
以下是关于用户信息条件的重要选项及其实例
-user
:查找属于某个用户的所有文件
-group
:查找属于某个组群的所有文件
find /home -user root # 查找/home目录中属于root用户的所有文件
/home
/home/study/readable
#查找/root目录下属于study用户的所有文件
find /root -user study
大于1M的文件:
new
开头文件
查找"/root”目录中正好符合“rw-rw-rw-”权限模式的文件。
查找“/ root”目录中包括“rw-rw-rw-”权限模式的文件。
gzip
压缩/解压缩
# 对文件进行压缩,默认得到*.gz文件
gzip test.png
tar [选项] 归档文件 [操作路径]
:对一组文件进行 归档/ 还原
重要选项:
-f
文件名:该选项是必要选项,用于指定生成的归档文件的名称,或要提取的归档文件的名称。-c( create)
:创建一个归档文件。-C( change)
:改变(跳转)到某个目录上进行操作。-x( extract)
提取归档文件中的文件。-z( gzip):
使用gzip方式对文件进行压缩或解压缩。-v( verbose)
:显示命令的执行过程。zip
:对于zip格式的压缩与解压
安装:yum install -y unzip
压缩
zip -q -r 1.zip 1.txt
# 将当前目录下的1.txt压缩为1.zip。选项-q表示忽略执行过程,-r表示递归处理,将指定目录下的所有文件和子目录一并处理
解压 unzip 1.zip
解压当当前目录下
unzip 1.zip -d folder :通过-d
指定解压路径,即解压到当前目录下folder
这个文件夹下,如果这个文件夹不存在,可以自动创建
在实际应用中常需要创建一些具有特殊格式的文1,如光盘文件(.iso
)创建方式往往是从某个具有这种格式的文件中读取数据块作为输入,结果复制写入到输出文件作为输出。此处介绍dd
命令用于文件的转换与复制
dd [选项] [操作路径]
重要选项:
if( input file)
:此选项后面需给出格式为“=文件路径”的参数作为输人文件,以此替代从标准输入中获取输入。of ( output file)
:此选项后面需给出格式为“=文件路径"的参数作为输出文件。bs( block size)
:此选项后面需给出参数指出每次读取和写人的子节数,可以使用K,M,G或KB、MB、GB等缩写表示字节数。常用文件系统类型:
1)ext
文件系统:是Linux的根文件所使用的文件类型
2)FAT
文件系统
3)ISO9660
文件系统应用于光盘介质的文件系统类型
虚拟文件系统
Linux 的根文件系统使用了ext
文件系统类型,然而除此之外Linux 还要文持各种类型的文件系统。例如,当使用到光盘时, Linux需要支持ISO9660
文件系统类型,当使用被格式化为FAT32
文件系统的U盘时,Linux 也需要根据VFAT文件系统的格式从U盘访向数据。因此Linux设计了虚拟文件系统(Virtual File System,VFS
)用于实现上述目的。虚拟文件系统相当于一个应用程序与各种存储设备及其文件系统之间的接口,用户在实际使用各种文件系统时并不需要关心到文件系统的真实特性,而是以统一的接口访向数据。
Linux各个目录的含义:
一级目录 | 功能(作用) |
---|---|
/bin/ |
存放系统命令,普通用户和 root 都可以执行。放在 /bin 下的命令在单用户模式下也可以执行 |
/boot/ |
系统启动目录,保存与系统启动相关的文件,如内核文件和启动引导程序(grub)文件等 |
/dev/ |
设备文件保存位置 |
/etc/ |
配置文件保存位置。系统内所有采用默认安装方式(rpm 安装)的服务配置文件全部保存在此目录中,如用户信息、服务的启动脚本、常用服务的配置文件等 |
/home/ |
普通用户的主目录(也称为家目录)。在创建用户时,每个用户要有一个默认登录和保存自己数据的位置,就是用户的主目录,所有普通用户的主目录是在 /home/ 下建立一个和用户名相同的目录。如用户 liming 的主目录就是 /home/liming |
/lib/ |
系统调用的函数库保存位置 |
/media/ |
挂载目录。系统建议用来挂载媒体设备,如软盘和光盘 |
/mnt/ |
挂载目录。早期 Linux 中只有这一个挂载目录,并没有细分。系统建议这个目录用来挂载额外的设备,如 U 盘、移动硬盘和其他操作系统的分区 |
/misc/ |
挂载目录。系统建议用来挂载 NFS 服务的共享目录。虽然系统准备了三个默认挂载目录 /media/、/mnt/、/misc/,但是到底在哪个目录中挂载什么设备可以由管理员自己决定。例如,笔者在接触 Linux 的时候,默认挂载目录只有 /mnt/,所以养成了在 /mnt/ 下建立不同目录挂载不同设备的习惯,如 /mnt/cdrom/ 挂载光盘、/mnt/usb/ 挂载 U 盘,都是可以的 |
/opt/ |
第三方安装的软件保存位置。这个目录是放置和安装其他软件的位置,手工安装的源码包软件都可以安装到这个目录中。不过笔者还是习惯把软件放到 /usr/local/ 目录中,也就是说,/usr/local/ 目录也可以用来安装软件 |
/root/ |
root 的主目录。普通用户主目录在 /home/ 下,root 主目录直接在“/”下 |
/sbin/ |
保存与系统环境设置相关的命令,只有 root 可以使用这些命令进行系统环境设置,但也有些命令可以允许普通用户查看 |
/srv/ |
服务数据目录。一些系统服务启动之后,可以在这个目录中保存所需要的数据 |
/tmp/ |
临时目录。系统存放临时文件的目录,在该目录下,所有用户都可以访问和写入。建议此目录中不能保存重要数据,最好每次开机都把该目录清空 |
与Windows的区别
当一个物理存储设备安装在硬件接口上(如将U盘插人到USB接口中)时,操作系统能够通过硬件检测程序发现该设备。
在文件系统官理上与 Windows 差异较大的另一点是,当接入某个物理存储设备时,Windows将会为新接入的设备分配一个盘符以供用户访问对应的文件系统,而Linux也会为该存储设备分配一个设备文件。然鹅在Linux 中,还需要指定一个在根文件系统下的目录作为所要挂载的文件系统的访问入口(挂载点)。也就是说, Linux将所有文件系统最终都纳入到根文件系统中。的日求结构对这些文件系统进行管理。相比之下, Linux这种管理系统的方式具有更高的可扩展性和灵活性。
/etc/fatab
文件
由于许多文件系统需要在系统初始化时进行挂载,例如根文件系统就必须是第一个进行挂载的文件系统,然后其他文件系统才能挂载在根文件系统的某个挂载点之下。因此Linux将在初始化需要挂载的文件系统的相关信息记录在“/etc/fstab
”文件中。以默认方式安装的RHEL系统,它的“/etc/istab”
文件的基本信息将会类似于如下示例内容:
与“/etc/passwd”等配置文件相类似, "/etc/fstab”文件的内容实际也是一张表,每一行代表一个文件系统的挂载信息,表格共有6列,以空格或制表符隔开。下面结合以上示例内容讨论“/etc/fstab”文件中从左到右各列的含义。
设备文件名/标签/UUID
挂载点
所要挂载的文件系统类型
挂载参数
是否使用dump命令备份系统;0表示不作自动备份
fsck
命令检查文件系统错误相关命令
mount [挂载] [设备文件名] [挂载路径]
挂载文件系统
-a(all)
:自动挂载所有在/etc/fstab
文件中记录的文件系统-t(type)
:给出参数指定所要挂载的文件系统类型,如ext4、iso9660、vfat等-o(option)
:给出额外的指定的一些挂载方式umount [选项] [设备文件名/挂载路径]
gedit /mnt/usb/test
umount /mnt/usb/test
fdisk
:磁盘及分区管理工具,在磁盘设备中创建、删除、更改分区等操作。【分区危险性高】
mkfs(make file system) [选项] 设备文件名
:创建文件系统【在硬盘分区后,使用mkfs
可对其格式化。格式化的过程即创建文件系统的过程。可以使用mkswap
可以格式化SWAP
交换分区】
-t(type)
:该选项所要创建的文件系统类型。mkfs支持的文件系统类型有ext2,ext3 ,ext4 , vfat等。-c( check)
:在格式化之即位查设备是否有坏数据块。-b (block-size)
: 该选项后需要给出参数指定基本数据块大小,参数可以是1024,2048和4096,单位为字节。N( number-of-inodes)
:该选项后面需要给出参数设定创建的索引结点数量。该数值将决定文件系统能够文持的最大文件数。如果没有特殊要求.可取默认设詈格式化之后挂载文件系统,然后查看U盘的内容:
可发现系统在U盘中自动生成了一个名为 lost+ found
的目录。如果系统因掉电等原因而导致文件丢失、系统重启后使用fsck
命令检查文件系统,则可能通过恢复操作找回这些文件,它们被放置于lost+found
目录里
文件系统的检查有两个方面的内容:
一是检查使用情况,最基本的是检查文件系统中已占用的空间已经剩余的空间;
另一方面是检查是否有错误
显示各个文件系统的存储空间的使用情况,如果指定某个文件名,则显示该文件所在的文件系统的信息。
df [选项] 文件名
重要选项:
-h( human-readable)
:命令默认以字节为单位显示结果,该选项能以用户友好好的方式(即以1K,234M,2G等方式)显示结果。-i( inode)
:查看索引结点 inode的使用情况。T( type)
:显示文件系统类型。功能:检测并修复文件系统中的错误。
fsck [选项] [设备文件名/挂载路径/设备标签/UUID]
-a
根据“/etc/fstab”中的内容按顺序检查-f force
强制检查,即使文件系统已经被标记为clean首先理解与进程有关的各类信息的基本含义。对于一个进程,主要可以查看或统计如下信息:
PID(Process id)
:进程号,它是系统为进程分配的唯一编号,用于标识进程的身份
PPID(Paren l))
:父进程(创建该进程的进程)的PID 号。
USER/UID
:执行该进程的用户身份及其UID。
TTY
:启动该进程的终端。
PRl (priorily)
:进程的优先级,数字越大表示优先级越低。
NlCE
:进程的谦让l:度、表示进程对CPU时间要求的迫切程度。
STAT( slate , 可用S表示)
:进程的状态,王要的进程状态有R ( Running,正在运行或已经就绪),S( Sleep,可以被唤醒的睡眠),D(不可唤醒的睡眠, 如等待IO的状态)、T( Stopped,已被停止),Z.( Zombic ,进程已经终止但未被父进程回收)等。
% CPU
:进程占用的 CPU比例。
%MEM
:进程占用的内存比例。
TIME
;进程实际占用CPU 的总时间。
ADDR
:进程在内存中的地址。
SZ
:进程占用的虚拟内存大小。
CMD( command)
:启动进程的命令。
获知进程状态是管理进程的第一步。Linux系统为查看进程的状态提供了许多接口,命令和工具。最典型的是proc
文件系统。proc文件系统是一个建立在内存的特殊文件系统,它的挂载点是"/proc”
,它记录了各进程以及其他系统信息。在proc文件系统中,每个目录对应于一个进程,目录以进程的PID
命名。进入某个进程对应的目录,里面有若干文件,这些文件记录了该进程当前运行的各种状态信息。应用程序可通过打开并读取这些文件来获取进程信息,因此proc文件系统实质为用户程序提供了一种了解内核的方式。许多系统管理命令,如后面所介绍的ps
命令, top
命令等都是通过读取并整理proc文件系统的内容后以更为友好的方式将进程的当前状态信息呈现给用户。
【示例11.1】查看“/proc"
文件系统的结构并查看1号目录的内容。1号目录记录的是1号进程的信息,1号进程也称为init
进程,是系统的第一个用户级进程。
在proc目录下ls列出文件信息
【示例11.2】查看1号进程的状态信息内容。这里查看了1号目录中的status文件获取1号进程的状态信息,进程名称、状态( state), PID 、PPID等基本信息以及使用虚拟内存等资源的情况。
【示例11.3】 查看系统的CPU信息。proc文件系统不仅记录了进程信息,还记录了各类系统信息,包括硬件信息,如CPU,内存等信息。作为示例这里查看了/proc/cpuinfo的内容,里面记录了与CPU有关的硬件信息。此外还可以通过访问/proc/meminfo获取内存的使用情况。
ps
命令:报告进程的相关信息
-e
:显示所有进程的信息-f
:全格式-l
:长格式(即更多字段)
PRI
Priority 进程优先级编号;NI
:优先级-a
:显示终端上的所有进程-u
:给出用户名参数指定显示属于该用户的进程-x
:显示没有控制终端的进程、aux
命令使用得最多
top
命令:以实时的方式显示当前的进程和状况
-d(delay)
:指定两次屏幕信息刷新之间的时间间pstree [选项] [进程PID/用户名]
命令:显示进程家族树,默认以init进程(1号进程)为根,可给出某进程的PID并指定查看以其为根
-p
:显示每个进程的PID号-u
:给出只显示属于哪个用户的进程lsof(list ooen files)
命令:列出由某进程打开的文件,默认显示所有进程所打开的文件。
-p
:给出一组进程PID,用于指定列出由该进程所打开的所有文件wait
实现对进程的等待
sleep [time]
将进程挂起一段时间
at
:某些系统命令占用CPU时间长,如果CPU繁忙,可以不立即执行,而是安排在空闲时或者指定时刻执行。
cron
crontab
用户可以通过向进程发送信号来控制进程。列出系统中定义的所有信号
中断后台进程kill
kill -s/p/a 进程号
-s
:指定需要发出的信号-p
:指定kill命令只是显示进程的PID,并不真正送出结束信号-l
:显示信号名称列表kill -l [信号]
数值越低,优先级越高。每个普通进程的优先级默认为80
线程的谦让度是-20~19的整数,谦让度为正数,表示进程的优先级下降
nice [选项-n] 启动的命令和参数
命令:设置启动进程的谦让度,不指定默认为10
-n
:给出设定的谦让度
nice -n -3 vim &
renice
命令:调整进程的优先级
Linux 系统在初始化时也会同时启动很多系统服务,这些服务分别依赖于运行在后台的各种守护进程(Daemon
)。守护进程独立于控制终端,也就是说他们并不是通过某个bash
进程启动的,它们的父进程是init
进程。例如查看守护进程sshd
的列表信息:
chkconfig
命令:设置守护进程在各个运行级下启动或关闭
--list
:该选项后面可给出服务名用于指定所要查看的守护进程设置情况,默认显示所有守护进程的设置情况。--level
:该洗项后面需给出运行级编号用于指定服务在哪个运行级下启动(on)或关闭。service
命令:查看、启动或关停系统服务
service 服务名 [start | stop | restart | status ]
注意对于非独立工作的守护进程,他们的启动和关停通过xientd
守护进程来实现。
systemctl
命令:是系统服务管理器指令,主要负责控制systemd系统和服务管理器,它实际上将 service 和 chkconfig 这两个命令组合到一起。
参考:linux命令学习之:systemctl-博客园
systemctl [start|stop|restart|status|reload] 服务名
类比于service
systemctl enable|disable [unit type
类比于chkconfig 命令
#停止cup电源管理服务
systemctl stop cups.service
#禁止cups服务开机启动
systemctl disable cups.service
#查看cups服务状态
systemctl status cups.service
#重新设置cups服务开机启动
systemctl enable cups.service
查看系统上所有的服务:systemctl [command] [–type=TYPE] [–all]
参数解释
command
- list-units:依据unit列出所有启动的unit。加上 –all 才会列出没启动的unit; - list-unit-files:依据/usr/lib/systemd/system/ 内的启动文件,列出启动文件列表–type=TYPE
- 为unit type, 主要有service, socket, targetsystemctl命令 | 说明 |
---|---|
systemctl | 列出所有的系统服务 |
systemctl list-units | 列出所有启动unit |
systemctl list-unit-files | 列出所有启动文件 |
systemctl list-units –type=service –all | 列出所有service类型的unit |
systemctl list-units –type=service –all grep cpu | 列出 cpu电源管理机制的服务 |
systemctl list-units –type=target –all | 列出所有target |
systemctl特殊的用法
systemctl命令 | 说明 |
---|---|
systemctl is-active [unit type] | 查看服务是否运行 |
systemctl is-enable [unit type] | 查看服务是否设置为开机启动 |
systemctl mask [unit type] | 注销指定服务 |
systemctl unmask [unit type] | 取消注销指定服务 |
在Linux中,作业(Job
)是一个需要与进程相区分的概念,它是指用户向系统提交并要求执行的一个任务。视任务的具体内容而定,一个作业可能需要执行一个或多个程序,即对应于一个或多个进程。用户每输入的一个shell命令其实可以看作是一个作业,这个作业经shell解释后对应于一个到多个进程加以执行。
【示例12.1】作业与进程的关系。用户提交第一条命令“ls -l/etc/ | more &”
后系统将其视作第1号作业,该作业由两个进程(PID =5425,5426)所构成,由于作业提交至后台执行,而more命令需要等待用户操作才能继续执行,因此两个进程都处于暂停状态。
前台和后台
作业管理的一个重要内容是用户如何通过终端按要求启动并执行某个作业,并且监控和调整作业的执行过程。对于一个终端,它有所谓前台( foreground)和后台( background)的概念。作业可以在前台执行,这时可以跟作业进行交互。由于前台只可执行一个作业,因此当用户不需要要与作业交互时,则作业可能需要在后台执行。如果用户想在作业启动之初就让其在后台运行,就需要在关于该作业的 shell命令结尾加上“&
”。
需要注意的是,前台和后台是对于终端而非整个系统而言。每个终端都有自己的前台和后台,它们彼此是独立的。从上一个示例中可知,作业执行时有作业号,用户可根据作业号查看作业的状态,以及设置作业在前台或后台运行。Linux提供了jobs
,fg
和 bg
3个命令实现进程的查看和控制。
相关命令
jobs [选项] [作业号]
命令:查看当前终端中的后台作业
-l(list)
:列出详细信息,包括构成作业的进程列表-s(stop)
:列出处于停止(暂停)状态的作业-r(running)
:列出正在运行状态的作业jobs
命令执行后将会返回显示一个作业列表。作业列表的每行信息以“[n]+”或“[n]-”
开头,其中“n”表示该行信息对应于第n号作业,而“+”号则表示该作业是最近第一个被放置在后台的作业,“-”号表示该作业是最近第二个被放置在后台的作业,注意由于不断有作业在前后台切换,因此每次显示的作业列表均有所不同。作业号旁边的是相关进程的PID号。
fg [作业号]
命令:让作业在终端后台执行。对于需要与用户交互的进程,如vim、top等,他们会处于被停止的状态,直到被调到前台执行
atd
进程
用户使用计算机的过程实际就是向操作系统提交并执行各种作业,并且获得处理结果的过程。这些作业的执行可以是一次性的,也可以是具有周期性的。无论是一次性作业还是周期性作业的执行,用户都需要指定何时系统开始执行作业,也即制订执行作业的计划。对于一次性作业的执行,需要检查是否已启动atd守护进程:
service atd status
aid(pid 2470)正在运行...
at [选项] 作业的执行时间
命令:在指定时间一次性地执行作业
用户需要使用at
命令指定作业的执行计划,包括指定执行作业的时间和作业的内容等等
主要选项:
-l
:对于root用户,列出所有作业队列中的作业,对于普通用户则列出由该用户制定的作业。该选项相当于执行atq
命令。-c
-:该选项后而需给出作业号参数,用于查看指定作业的执行内容。-f(file)
:该选项后面需给出所要执行的作业文件路。默认环境下at命令建立一个环境供用户输入要执行的命令。-d(delete)
:该选项后面需给出作业号参数,用于删除指定的作业。利用at命令制订作业执行计划需要正确地表达作业的计划执行时间。at命令提供了许多表示时间格式的方法,一般可分为绝对时间和相对时间两种表示方法。
batch
命令;
由于用户提交的作业有可能会占用许多系统资源,因此系统可能需要在负载较大时暂缓调度作业。batch
命令能满足这一万面的需求。batch命令实际也是调用at命令执行作业,但是他在执行某个作业之前回检测系统的负载水平,默认只有低于0.8
时才能开始执行作业。另一点与at命令不同的是, batch命令并不接受设定作业的指定时间,提交作业后如果系统负载过高就会一直等待到负载降至0.8以下才会调度执行,如果系统负载并未超出0.8则作业会立即执行。
cron
:可以按一定的时间自动完成任务调度。实际上cron
命令不是手动启动的。cron
命令在启动时由一个shell脚本自动启动,进入后台。crontab
:用于安装、删除或者列出用于驱动cron
后台进程的表格。即:把需要执行的命令序列放到crontab
文件中得以执行。# 1. 列出当前系统中的所有进程,如何观察进程的优先级?
ps -aux
看`Prl`表示的就是进程ps的优先级
# 2. 查看当前终端运行的bash进程的PID,在当前终端启动vim编辑器并让其在后台执行,然后列出在当前终端中执行的进程的家族树。
ps # 找到bash进程
vim &
pstree PID
3. 请自行挂载u盘或光盘,然后列出与该设备关联的所有进程。
# 4. 启动top命令后暂停对应进程的执行,然后查看该进程的PID,最后通过kill命令发送信号让该进程的终止执行。
top 再按Ctrl+Z
ps 【显示top的PID】
kill -9 PID
# 5. 利用nice程序启动三个vim程序,设置它们的谦让度分别为5,10,15,使用ps命令观察这三个vim程序的优先级设置结果。
nice -n -5 vim &
nice -n -10 vim &
nice -n -15 vim &
ps -l
# 6. 请通过ps命令指出当前系统中的一些守护进程,列出他们的PID以及谦让度。
# 7. 查看守护进程sshd的当前状态,检查sshd服务在第3,5运行级下是否设置为启动。
ps -el | grep sshd
8. 参考综合实训案例11.1和11.2,利用案例所提供的process.sh脚本,启动3个进程并分别设置它们的谦让度为-15, 0和15,运行一段时间后观察这3个进程在累计占用CPU时间(TIME+)以及占用CPU比率(%CPU)上的差异以及系统的平均负载的变化,然后暂停上述3个进程的执行,重新设置它们的谦让度为-5,0和5,再次在运行一段时间后继续观察它们竞争CPU的表现。
ifconfig
:用于查看和更改网络接口的地址和参数
interface
:网络接口名,如eth0,eth1up
:激活网卡设备down
:关闭网卡设备boardcast address
:设置接口的广播地址pointpoint
:启动点对点的方式address
:指定设备的ip地址netmask address
:设置子网掩码ifconfig eth1 # 查看网卡eth1的状态
ifconfig eth1 up #激活网卡eth1
ping
:使用ICMP协议来检测整个网络的联通情况
ping 本机IP # 查看本机网络接口是狗正确配置
ping 本机主机名 #检测计算机名是否正确
ping 网关 # 检测和局域网的主机是否联通
netstat
:用于检测网络状态
netstat -antpu # 常用查看命令
netstat -a # 显示已经建立连接的接口
netstat -rn # 显示路由表状态,且直接使用I及端口号
netstat -tulnp # 目前已经启动的网络服务
-s
:按照各个协议分别显示其统计数据
-t
:显示tcp传输协议的连接状态
-u
:显示udp传输协议的连接状态
-w
:显示RAW传输协议的连接状态
-p
:显示正在使用socket的程序识别码和程序名称
参考链接:一篇文章让你彻底掌握 shell 语言-博客园
shell种类:
指定脚本管理器:
在 shell 脚本,#!
告诉系统其后路径所指定的程序即是解释此脚本文件的 Shell 解释器。#!
被称作shebang(也称为 Hashbang )。
# 指定 sh 解释器
#!/bin/sh
# 指定 bash 解释器
#!/bin/bash
# 系统会自动在 PATH 环境变量中查找你指定的程序(使用新版)
#!/usr/bin/env bash
脚本是一种不经编译而直接被解释和执行的程序。
编写hello world
#!/bin/sh
echo hello world
然后执行:
. hello.sh
或者赋予可执行权限
chmod u+x hello
./hello.sh
shell脚本的执行方式
./hello.sh
或者bash hello.sh
是由当前字符终端的bash进程接收了输入的命令,bash作为父进程创建了用于执行hello.sh脚本的子进程
. hello.sh
或者source hello.sh
则bash进程或者调用hello. sh脚本的进程将不会创建新的用于执行hello. sh脚本的子进程,而是由它们自己直接执行hello. sh脚本。
全局环境变量:由系统预定义并使用在bash进程,而且在bash进程所创建的子进程中也能使用。
PATH | 命令查找路径 | HOSTNAME | 主机名称 |
---|---|---|---|
HOME | 当前用户的主目录 | 当前用户的邮件存放目录 | |
SHELL | 当前系统使用的shell类型 | LOGNAME | 当前用户的登录名 |
PS1 | 命令提示符 | USER | 当前用户的账号名称 |
ROOT | 用户的宿主目录 | PATH | 命令查找目录 |
HOMENAME | 主机名称 |
利用printenv
命令可以获取当前进程有关的全局环境变量
局部环境变量:是由用户或脚本自定义的环境变量。只能在定义他的进程中使用。
内部变量是指shell 的一些预定义变量,提供给用户在程序运行时做判断和使用。内部变量由系统提供,不可修改。
$0 |
当前脚本的名称 | $* |
保存所有参数的信息 |
---|---|---|---|
$n(1\2\3...) |
命令行的第n个参数 | $? |
前一个命令或函数的返回值 |
$# |
命令行的参数个数 | $$ |
脚本的进程号 |
注意
变量赋值没有空格,如果要获取变量的值,则需要通过
$
的形式读取变量的值可用
export
命令让某个局部环境变量输出成为全局环境变量
export
命令可将shell脚本中的定义的变量导出到子shell中,并使之在子shell中有。在默认情况下,在一个shell中被创建的变量在这个shell调用的下级(子)shell中是不可用的。export命令把自己的参数创建为一个变量,而这个环境变量可以被其他脚本和当前程序调用的程序看见。
当在某个字符终端下利用export命令输出一个变量成为全局环境变量后.如果通过使用“./脚本名"或" bash脚本名"
的方式来执行脚本,那么bash进程为脚本所创建的子进程就可使用该全局环境变量,然而子进程对全局环境变量的修改并不会影响父讲程bash中的对应变量的值。另一方面,如果是以“.脚本名”或“ source脚本名"
的方式来执行脚本,由于bash进程并没有创建额外的子进程去执行脚本,因此脚本对全局变量的修改实际就是对bash进程中对应变量的值的改变。总之要问住的具每个讲程都有自己的一组环境变量。
字符串的截取
expr substr 字符串 起始位置(从1开始) 截取长度
字符串的定位
expr index 字符串 字符
字符串匹配(字符串是否为字符串1的子串)
expr match 字符串1 字符串2
长度
expr length 字符串
运算符 | 说明 | 举例 |
---|---|---|
= |
检测两个字符串是否相等,相等返回 true。 | [ $a = $b ] 返回 false。 |
!= |
检测两个字符串是否相等,不相等返回 true。 | [ $a != $b ] 返回 true。 |
-z (zero) |
检测字符串长度是否为 0,为 0 返回 true。 | [ -z $a ] 返回 false。 |
-n |
检测字符串长度是否大于 0,不为 0 返回 true。 | [ -n $a ] 返回 true。 |
str |
检测字符串是否为空,不为空返回 true。 | [ $a ] 返回 true。 |
对于整数运算,可以使用$[ 运算表达式 ]
,Bash将计算 并返回运算表达式的值。
注意运算表达式与方括号之间有空格。
bc
计算器echo=$[ 2 * 4 ]
下表列出了常用的算术运算符,假定变量 x 为 10,变量 y 为 20:
运算符 | 说明 | 举例 |
---|---|---|
+ | 加法 | expr $x + $y 结果为 30。 |
- | 减法 | expr $x - $y 结果为 -10。 |
* | 乘法 | expr $x * $y 结果为 200。 |
/ | 除法 | expr $y / $x 结果为 2。 |
% | 取余 | expr $y % $x 结果为 0。 |
= | 赋值 | x=$y 将把变量 y 的值赋给 x。 |
== | 相等。用于比较两个数字,相同则返回 true。 | [ $x == $y ] 返回 false。 |
!= | 不相等。用于比较两个数字,不相同则返回 true。 | [ $x != $y ] 返回 true。 |
**注意:**条件表达式要放在方括号之间,并且要有空格,例如: [$x==$y]
是错误的,必须写成 [ $x == $y ]
。
关系运算符只支持数字,不支持字符串,除非字符串的值是数字。
运算符 | 说明 | 举例 |
---|---|---|
-eq |
检测两个数是否相等,相等返回 true。 | [ $a -eq $b ] 返回 false。 |
-ne |
检测两个数是否相等,不相等返回 true。 | [ $a -ne $b ] 返回 true。 |
-gt |
检测左边的数是否大于右边的,如果是,则返回 true。 | [ $a -gt $b ] 返回 false。 |
-lt |
检测左边的数是否小于右边的,如果是,则返回 true。 | [ $a -lt $b ] 返回 true。 |
-ge |
检测左边的数是否大于等于右边的,如果是,则返回 true。 | [ $a -ge $b ] 返回 false。 |
-le |
检测左边的数是否小于等于右边的,如果是,则返回 true。 | [ $a -le $b ] 返回 true。 |
下表列出了常用的布尔运算符,假定变量 x 为 10,变量 y 为 20:
运算符 | 说明 | 举例 |
---|---|---|
! |
非运算,表达式为 true 则返回 false,否则返回 true。 | [ ! false ] 返回 true。 |
-o 或 ` |
` | |
-a 或 && |
与运算,两个表达式都为 true 才返回 true。 | [ $a -lt 20 -a $b -gt 100 ] 返回 false。 |
-d |
确定文件是否为目录 |
---|---|
-f |
确定文件是否为普通文件 |
-e |
确定文件是否存在 |
-r |
确定是否对文件设置读许可 |
-w |
确定是否对文件设置写许可 |
-x |
确定是否对文件设置执行许可 |
-s |
确定文件名是否具有大于零的长度 |
井号# | 注释(多行注释:< |
---|---|
美元符号$ | 引用变量值 |
双引号"" |
双引号:特殊字符仍可以被使用 |
单引号'' |
单引号:特殊字符作为普通字符处理 |
反引号`` | 执行两个``命令之间的内容 |
`` | 执行两个``之间的命令内容【比如打印时间】 |
\ | 将后面的字符转义:echo \"age\"" ==> "age" |
printf
:用于格式化输出字符串(不过不像echo
那样自动输出换行符)
# 创建数组的不同方式
nums=([2]=2 [0]=0 [1]=1)
colors=(red yellow "dark blue")
# 数组的访问
echo ${nums[1]}
# Output: 1
# 访问数组的所有元素
echo ${colors[*]}
# Output: red yellow dark blue
# 访问数组长度
echo ${#nums[*]}
# 输出3
# 向数组中添加元素white与green与black
colors=(white "${colors[@]}" green black)
# 数组元素的删除
unset nums[0]
Bash 中的条件语句让我们可以决定一个操作是否被执行。结果取决于一个包在[[ ]]
里的表达式。
if
语句
if
在使用上跟其它语言相同。如果中括号里的表达式为真,那么then
和fi
之间的代码会被执行。fi
标志着条件代码块的结束。
# 写成一行
if [[ 1 -eq 1 ]]; then echo "1 -eq 1 result is: true"; fi
# Output: 1 -eq 1 result is: true
# 写成多行
if [[ "abc" -eq "abc" ]]
then
echo ""abc" -eq "abc" result is: true"
fi
# Output: abc -eq abc result is: true
if else
语句
同样,我们可以使用if..else
语句,例如:
if [[ 2 -ne 1 ]]; then
echo "true"
else
echo "false"
fi
# Output: true
Bash 中有四种循环:for
,while
,until
和select
。
for
循环
for arg in elem1 elem2 ... elemN
do
### 语句
done
在每次循环的过程中,arg
依次被赋值为从elem1
到elemN
。这些值还可以是通配符或者大括号扩展。
当然,我们还可以把for
循环写在一行,但这要求do
之前要有一个分号,就像下面这样:
for i in {1..5}; do echo $i; done
还有,如果你觉得for..in..do
对你来说有点奇怪,那么你也可以像 C 语言那样使用for
,比如:
for (( i = 0; i < 10; i++ )); do
echo $i
done
当我们想对一个目录下的所有文件做同样的操作时,for
就很方便了。举个例子,如果我们想把所有的.bash
文件移动到script
文件夹中,并给它们可执行权限,我们的脚本可以这样写:
DIR=/home/zp
for FILE in ${DIR}/*.sh; do
mv "$FILE" "${DIR}/scripts"
done
# 将 /home/zp 目录下所有 sh 文件拷贝到 /home/zp/scripts
while
循环
while [[ condition ]]
do
### 语句
done
# 例如:求 0到9之间每个数的平方
x=0
while [[ ${x} -lt 10 ]]; do
echo $((x * x))
x=$((x + 1))
done
until
循环:与while循环相反,只要该条件为 假 就一直执行循环
select
循环:select
会打印elem1..elemN
以及它们的序列号到屏幕上,之后会提示用户输入。通常看到的是$?
(PS3
变量)。用户的选择结果会被保存到answer
中。如果answer
是一个在1..N
之间的数字,那么语句
会被执行,紧接着会进行下一次迭代 —— 如果不想这样的话我们可以使用break
语句。
bash 函数定义语法如下:
[ function ] funname [()] {
action;
[return int;]
}
说明:
- 函数定义时,
function
关键字可有可无。- 函数返回值 - return 返回函数返回值,返回值类型只能为整数(0-255)。如果不加 return 语句,shell 默认将以最后一条命令的运行结果,作为函数返回值。
- 函数返回值在调用该函数后通过
$?
来获得。- 所有函数在使用前必须定义。这意味着必须将函数放在脚本开始部分,直至 shell 解释器首次发现它时,才可以使用。调用函数仅使用其函数名即可。
位置参数是在调用一个函数并传给它参数时创建的变量。
位置参数变量表:
变量 | 描述 |
---|---|
$0 |
脚本名称 |
$1 … $9 |
第 1 个到第 9 个参数列表 |
${10} … ${N} |
第 10 个到 N 个参数列表 |
$* or $@ |
除了$0 外的所有位置参数 |
$# |
不包括$0 在内的位置参数的个数 |
$FUNCNAME |
函数名称(仅在函数内部有值) |
参数处理 | 说明 |
---|---|
$# |
返回参数个数 |
$* |
返回所有参数 |
$$ |
脚本运行的当前进程 ID 号 |
$! |
后台运行的最后一个进程的 ID 号 |
$@ |
返回所有参数 |
$- |
返回 Shell 使用的当前选项,与 set 命令功能相同。 |
$? |
函数返回值 |
Bash 接收输入,并以字符序列或 字符流 的形式产生输出。这些流能被重定向到文件或另一个流中。
有三个文件描述符:
代码 | 描述符 | 描述 |
---|---|---|
0 |
stdin |
标准输入 |
1 |
stdout |
标准输出 |
2 |
stderr |
标准错误输出 |
重定向让我们可以控制一个命令的输入来自哪里,输出结果到什么地方。这些运算符在控制流的重定向时会被用到:
Operator | Description |
---|---|
> |
重定向输出 |
&> |
重定向输出和错误输出 |
&>> |
以附加的形式重定向输出和错误输出 |
< |
重定向输入 |
<< |
Here 文档 语法 |
<<< |
Here 字符串 |
/dev/null
文件如果希望执行某个命令,但又不希望在屏幕上显示输出结果,那么可以将输出重定向到 /dev/null:
$ command > /dev/null
/dev/null 是一个特殊的文件,写入到它的内容都会被丢弃;如果尝试从该文件读取内容,那么什么也读不到。但是 /dev/null 文件非常有用,将命令的输出重定向到它,会起到"禁止输出"的效果。
如果希望屏蔽 stdout 和 stderr,可以这样写:
$ command > /dev/null 2>&1
参考 菜鸟教程
基于 RPM 包管理,能够从指定的服务器自动下载 RPM 包并且安装,可以自动处理依赖性关系,并且一次安装所有依赖的软件包,无须繁琐地一次次下载、安装。
yum 提供了查找、安装、删除某一个、一组甚至全部软件包的命令,而且命令简洁而又好记。
有三个文件描述符:
代码 | 描述符 | 描述 |
---|---|---|
0 |
stdin |
标准输入 |
1 |
stdout |
标准输出 |
2 |
stderr |
标准错误输出 |
重定向让我们可以控制一个命令的输入来自哪里,输出结果到什么地方。这些运算符在控制流的重定向时会被用到:
Operator | Description |
---|---|
> |
重定向输出 |
&> |
重定向输出和错误输出 |
&>> |
以附加的形式重定向输出和错误输出 |
< |
重定向输入 |
<< |
Here 文档 语法 |
<<< |
Here 字符串 |
/dev/null
文件如果希望执行某个命令,但又不希望在屏幕上显示输出结果,那么可以将输出重定向到 /dev/null:
$ command > /dev/null
/dev/null 是一个特殊的文件,写入到它的内容都会被丢弃;如果尝试从该文件读取内容,那么什么也读不到。但是 /dev/null 文件非常有用,将命令的输出重定向到它,会起到"禁止输出"的效果。
如果希望屏蔽 stdout 和 stderr,可以这样写:
$ command > /dev/null 2>&1
参考 菜鸟教程
基于 RPM 包管理,能够从指定的服务器自动下载 RPM 包并且安装,可以自动处理依赖性关系,并且一次安装所有依赖的软件包,无须繁琐地一次次下载、安装。
yum 提供了查找、安装、删除某一个、一组甚至全部软件包的命令,而且命令简洁而又好记。