您的位置:首页 > 运维架构 > Shell

《linux命令行与shell脚本编程大全》第三版 - 核心笔记(1/4):理解shell与linux命令

2017-06-11 00:31 232 查看
《linux命令行与shell脚本编程大全》

全书4部分:
☆ 【1】linux命令行(1-10章):理解shell与linux命令
☆ 【2】shell脚本编程基础(11-16章)
☆ 【3】高级shell脚本编程(17-23章)
☆ 【4】创建实用的脚本(24-26章)

>>第1章丶初识linux shell

Linux可划分为以下四部分:

 Linux内核

 GNU工具

 图形化桌面环境

 应用软件



linux内核主要负责以下四种功能:

 系统内存管理

 软件程序管理

 硬件设备管理

 文件系统管理

linux设备文件有3种分类:

 字符型设备文件

 块设备文件

 网络设备文件

Linux内核采用虚拟文件系统(Virtual File System, VFS)作为和每个文件系统交互的接口。

这为Linux内核同任何类型文件系统通信提供了一个标准接口。当每个文件系统都被挂载和使用时, VFS将信息都缓存在内存中。

GNU coreutils软件包由三部分构成:

 用以处理文件的工具

 用以操作文本的工具

 用以管理进程的工具

所有Linux发行版默认的shell都是bash shell。

>>第2章丶走进shell

使用快捷键Ctrl+Alt+T快速访问GNOME终端Terminal。

Open Terminal Shift+Ctrl+N 在新的GNOME Terminal窗口中启动一个新的shell会话

Open Tab Shift+Ctrl+T 在现有的GNOME Terminal窗口的新标签中启动一个新的shell会话

Close Tab Shift+Ctrl+W 关闭当前标签中的会话

Close Window Shift+Ctrl+Q 关闭当前的GNOME Terminal会话

Zoom In Ctrl++ 逐步增大窗口显示字号

Zoom Out Ctrl+- 逐步减小窗口显示字号

Normal Size Ctrl+0 恢复默认字号

Find Shift+Ctrl+F 打开Find窗口,提供待搜索文本的搜索选项

Find Next Shift+Ctrl+H 从终端会话的当前位置开始向前搜索指定文本

Find Previous Shift+Ctrl+G 从终端会话的当前位置开始向后搜索指定文本

Next Tab Ctrl+PageDown 使下一个标签成为活动标签

Previous Tab Ctrl+PageUp 使上一个标签成为活动标签

Move Tab Left Shift+Ctrl+PageUp 将当前标签移动到前一个标签的前面

Move Tab Right Shift+Ctrl+PageDown 将当前标签移动到下一个标签的后面

>>第3章丶基本的bash命令

/etc/passwd文件包含了所有系统用户账户列表以及每个用户的基本配置信息:

    christine:x:501:501:Christine Bresnahan:/home/christine:/bin/bash

    // 冒号分隔字段,最后一个字段指定了用户使用的shell程序

man手册的重点尤其是阅读第一段或是DESCRIPTION部分的前两段。

可以通过点击空格键进行翻页,或是使用回车键逐行查看。另外还可以使用箭头键向前向后滚动手册页的内容,q键退出。

[窍门] 如果不记得命令名怎么办?可以使用关键字搜索手册页。语法是: man -k 关键字。

例如,要查找与终端相关的命令,可以输入 $:' man -k terminal

Linux手册页的内容区域:

    1 可执行程序或shell命令
    2 系统调用

    3 库调用

    4 特殊文件

    5 文件格式与约定

    6 游戏

    7 概览、约定及杂项

    8 超级用户和系统管理员命令

    9 内核例程

如 $:' man 1 hostname

如 $:' man 7 hostname

系统调用(2)和库调用(3)会更加常用一些。

[窍门]大多数命令都可以接受-help或--help选项,或者直接使用man 命令查看命令的使用帮助信息。

Linux使用正斜线(/)而不是反斜线(\)在文件路径中划分目录。

举个例子,在Windows中经常看到这样的文件路径:

    c:\Users\Rich\Documents\test.doc

在Linux中,你会看到下面这种路径:

    /home/Rich/Documents/test.doc

常见linux目录名称:

/ 虚拟目录的根目录。通常不会在这里存储文件

/bin 二进制目录,存放许多用户级的GNU工具

/boot 启动目录,存放启动文件

/dev 设备目录, Linux在这里创建设备节点

/etc 系统配置文件目录

/home 主目录, Linux在这里创建用户目录

/lib 库目录,存放系统和应用程序的库文件

/media 媒体目录,可移动媒体设备的常用挂载点

/mnt 挂载目录,另一个可移动媒体设备的常用挂载点

/opt 可选目录,常用于存放第三方软件包和数据文件

/proc 进程目录,存放现有硬件及当前进程的相关信息

/root root用户的主目录

/sbin 系统二进制目录,存放许多GNU管理员级工具

/run 运行目录,存放系统运作时的运行时数据

/srv 服务目录,存放本地服务的相关文件

/sys 系统目录,存放系统硬件信息的相关文件

/tmp 临时目录,可以在该目录中创建和删除临时工作文件

/usr 用户二进制目录,大量用户级的GNU工具和数据文件都存储在这里

/var 可变目录,用以存放经常变化的文件,比如日志文件

cd 进入目录
pwd 显示当前所在目录完整路径
ls 显示当前目录下的文件和目录

    -F 区分文件与目录显示

    -a 显示隐藏文件和普通文件

    -R 递归显示子目录和文件

    -l 显示长列表文件属性详情

    -lh 将文件大小附带单位进行显示,如K,M

    -i 显示inode编号

[窍门] 选项并一定要像例子中那样分开输入: ls –F –R。它们可以进行如下合并:
ls –FR。

标准通配符:

问号 ? 代表一个字符;

星号 * 代表零个或多个字符;

中括号 [a–z] 代表匹配a到z之间的字母;

感叹号 [!a] 将不需要的内容排除在外,如包含a。

举例:

    $:' ls -l f[a-i]ll

    $:' ls -l f[!a]ll

touch 创建空文件

    -a 只改变访问时间
cp 复制文件

    -i 强制shell询问是否需要覆盖已有文件
ln 创建连接文件,不带-s参数默认创建硬链接

    -s 创建为符号链接,即软连接

    举例:$:' $ ln -s data_file sl_data_file

        // 符号链接的名字sl_data_file位于ln命令中的第二个参数位置上。显示在长列表中符号文件名后的->符号表明该文件是链接到文件data_file上的一个符号链接。
mv 重命名文件或者移动文件
rm 删除文件

    -rf 删除目录并且不需要提示(小心使用)
mkdir 创建目录

    -p 创建多级目录
rmdir 删除目录,可用 rm -r 代替
tree 显示树形结构的目录结构,需要使用apt-get安装此工具

举例:$:' tree Small_Dir

        Small_Dir

        ├─ a_file

        ├─ b_file

        ├─ c_file

        ├─ Teeny_Dir

        │ └─ e_file

        └─ Tiny_Dir

        └─ d_file

file 查看文件类型
cat 查看整个文件内容

    -n 显示行号

    -b 有文本的地方才显示行号
more 每页显示内容
less 是more命令的升级版
tail 查看文件末尾10行内容

    -n 指定从尾部开始查看的行数,如 tail -n 2 filename
head 查看文件起始10行内容

    -n 该参数可省略,如 head -5 filename

>>第4章丶更多的shell命令

ps 显示正在运行的进程信息

    -A 显示所有进程

    -N 显示与指定参数不符的所有进程

    -a 显示除控制进程( session leader① )和无终端进程外的所有进程

    -d 显示除控制进程外的所有进程

    -e 显示所有进程

    -C cmdlist 显示包含在cmdlist列表中的进程

    -G grplist 显示组ID在grplist列表中的进程

    -U userlist 显示属主的用户ID在userlist列表中的进程

    -g grplist 显示会话或组ID在grplist列表中的进程②

    -p pidlist 显示PID在pidlist列表中的进程

    -s sesslist 显示会话ID在sesslist列表中的进程

    -t ttylist 显示终端ID在ttylist列表中的进程

    -u userlist 显示有效用户ID在userlist列表中的进程

    -F 显示更多额外输出(相对-f参数而言)

    -O format 显示默认的输出列以及format列表指定的特定列

    -M 显示进程的安全信息

    -c 显示进程的额外调度器信息

    -f 显示完整格式的输出

    -j 显示任务信息

    -l 显示长列表

    -o format 仅显示由format指定的列

    -y 不要显示进程标记( process flag,表明进程状态的标记)

    -Z 显示安全标签( security context) ① 信息

    -H 用层级格式来显示进程(树状,用来显示父进程)

    -n namelist 定义了WCHAN列显示的值

    -w 采用宽输出模式,不限宽度显示

    -L 显示进程中的线程

    -V 显示ps命令的版本号
top 实时监测进程的详细运行情况
kill 向进程通过进程id发送信号
killall 可以通过进程名向进程发送信号,也支持通配符,在系统因负载过大而变得很慢时很有用

mount 挂载文件或者设备,手动挂载媒体设备的基本命令格式:mount -t type device directory

通常得使用下列文件系统类型。

 vfat: Windows长文件系统。

 ntfs: Windows NT、 XP、 Vista以及Windows 7中广泛使用的高级文件系统。

 iso9660:标准CD-ROM文件系统。

大多数U盘和软盘会被格式化成vfat文件系统。而数据CD则必须使用iso9660文件系统类型。

后面两个参数定义了该存储设备的设备文件的位置以及挂载点在虚拟目录中的位置。比如说,手动将U盘/dev/sdb1挂载到/media/disk,可用下面的命令:

    $:' mount -t vfat /dev/sdb1 /media/disk
umount 卸载指定的挂载设备,umount命令的格式非常简单:umount [directory | device ]

df 查看所有已挂载磁盘的使用情况

    -h 以易读的大小方式显示
du 查看磁盘使用情况,需要指定查看的目录

    -h 以易读的大小方式显示

sort 按照会话指定的默认语言的排序规则对文本文件中的数据行排序

    -n 把数字识别成数字而不是字符,并且按值排序

    -M 按月排序

举例:$:' du -sh * | sort -nr

        // 显示当前目录下所有文件的大小,并按照大小进行反序排序输出

grep 搜索数据命令,格式如下:grep [options] pattern [file]

linux下压缩数据:
bzip2 .bz2 采用Burrows-Wheeler块排序文本压缩算法和霍夫曼编码
compress .Z 最初的Unix文件压缩工具,已经快没人用了
gzip .gz GNU压缩工具,用Lempel-Ziv编码
zip .zip Windows上PKZIP工具的Unix实现

tar Unix和Linux上最广泛使用的归档工具,格式:tar function [options] object1 object2 ...

首先,你可以用下列命令来创建一个归档文件:

    $:' tar -cvf test.tar test/ test2/

上面的命令创建了名为test.tar的归档文件,含有test和test2目录内容。接着,用下列命令:

    $:' tar -tf test.tar

列出tar文件test.tar的内容(但并不提取文件)。最后,用命令:

    $:' tar -xvf test.tar

通过这一命令从tar文件test.tar中提取内容。

[窍门] 下载了开源软件之后,你会经常看到文件名以.tgz结尾。这些是gzip压缩过的tar文件可以用命令tar -zxvf filename.tgz来解压。

>>第5章丶理解shell

命令列表要想成为进程列表,这些命令必须包含在括号里:

    $:' (pwd ; ls ; cd /etc ; pwd ; cd ; pwd ; ls)

探索后台模式:

$:' sleep 10 &

$:' ps -f

jobs 显示后台作业信息,如刚才的 sleep 10
coproc 协程可以同时做两件事,在后台生成一个子shell,并在子shell中执行命令
which 查找外部命令的位置
type -a 查找外部命令的位置
history 查看最近用过的命令列表

>>第6章丶使用linux环境变量

printenv 全局环境变量
echo $VAL 显示变量VAL的值
VAL=$VAL
export 设置全局环境变量
unset 删除环境变量

/etc/profile文件是bash shell默认的的主启动文件。只要你登录了Linux系统, bash就会执行/etc/profile启动文件中的命令。

.bashrc文件有两个作用:

一是查看/etc目录下通用的bashrc文件;

二是为用户提供一个定制自己的命令别名和私有脚本函数的地方。

数组变量:

    $:' mytest=(one two three four five)

    $:' echo $mytest

    one

    $:' echo ${mytest[2]}

    three

    $:' echo ${mytest[*]}

    one two three four five

    $:' mytest[2]=seven

    $:' echo ${mytest[*]}

    one two seven four five

    $:' unset mytest[2]

    $:' echo ${mytest[*]}

    one two four five

    $:' echo ${mytest[2]}

    $:' echo ${mytest[3]}

    four

    $:' unset mytest

    $:' echo ${mytest[*]}

    // 什么也不会输出,值全部删除了

>>第7章丶linux文件权限

Linux系统使用一个专门的文件来将用户的登录名匹配到对应的UID值(user id)。

/etc/passwd字段:

    root:x:0:0:root:/root:/bin/bash

/etc/passwd文件的字段包含了如下信息:
 登录用户名

 用户密码

 用户账户的UID(数字形式)

 用户账户的组ID(GID)(数字形式)

 用户账户的文本描述(称为备注字段)

 用户HOME目录的位置

 用户的默认shell

Linux系统密码管理提供了更多的控制。

/etc/shadow文件为系统上的每个用户账户都保存了一条记录。记录就像下面这样:

    rich:$1$.FfcK0ns$f1UgiyHQ25wrB/hykCn020:11627:0:99999:7:::

在/etc/shadow文件的每条记录中都有9个字段:

 与/etc/passwd文件中的登录名字段对应的登录名

 加密后的密码

 自上次修改密码后过去的天数密码(自1970年1月1日开始计算)

 多少天后才能更改密码

 多少天后必须更改密码

 密码过期前提前多少天提醒用户更改密码

   密码过期后多少天禁用用户账户

 用户账户被禁用的日期(用自1970年1月1日到当天的天数表示)

 预留字段给将来使用

Linux系统添加新用户的主要工具是useradd。

    #:' /usr/sbin/useradd -D

    GROUP=100

    HOME=/home

    INACTIVE=-1

    EXPIRE=

    SHELL=/bin/bash

    SKEL=/etc/skel

    CREATE_MAIL_SPOOL=yes

 新用户会被添加到GID为100的公共组;

 新用户的HOME目录将会位于/home/loginname;

 新用户账户密码在过期后不会被禁用;

 新用户账户未被设置过期日期;

 新用户账户将bash shell作为默认shell;

 系统会将/etc/skel目录下的内容复制到用户的HOME目录下;

 系统为该用户账户在mail目录下创建一个用于接收邮件的文件。

从系统中删除用户, userdel可以满足这个需求。userdel命令会只删除/etc/passwd文件中的用户信息,而不会删除系统中属于该账户的任何文件。

    #:' /usr/sbin/userdel -r test

    #:' ls -al /home/test

    ls: cannot access /home/test: No such file or directory

用户账户修改工具:
usermod 修改用户账户的字段,还可以指定主要组以及附加组的所属关系
passwd 修改已有用户的密码
chpasswd 从文件中读取登录名密码对,并更新密码
chage 修改密码的过期日期
chfn 修改用户账户的备注信息
chsh 修改用户账户的默认登录shell

/etc/group文件包含系统上用到的每个组的信息。
groupadd 命令可在系统上创建新组。
groupmod 命令可以修改已有组的GID(加-g选项)或组名(加-n选项)。

文件权限:
umask命令用来设置所创建文件和目录的默认权限。

对文件来说,全权限的值是666(所有用户都有读和写的权限);而对目录来说,则是777(所有用户都有读、写、执行权限)。

如:umask值为 0022,第一位为粘着位,后面三个在创建文件或目录的时候会用全权限值减去umask值。
    666 - 022 = 644(新创建文件权限)-rw-rw-r--

    777 - 022 = 755(新创建目录权限)drwxrwxr-x

chmod 改变文件权限,命令格式:chmod options mode file

    options 可取格式:[ugoa…][[+-=][rwxXstugo…],如 o+w
chown 改变所属关系,命令格式:chown options owner[.group] file
chgrp 更改文件或目录的默认属组。

>>第8章丶管理文件系统

ext 扩展文件系统

基本linux文件系统:ext → ext2

日志文件系统:ext3 → ext4 → Reiser → JFS → XFS

写时复制文件系统:ZFS → Btrf

创建分区:
fdisk工具用来帮助管理安装在系统上的任何存储设备上的分区(root用户权限)。

    $:' sudo fdisk /dev/sdb

    a 设置活动分区标志

    b 编辑BSD Unix系统用的磁盘标签

    c 设置DOS兼容标志

    d 删除分区

    l 显示可用的分区类型

    m 显示命令选项

    n 添加一个新分区(基本)

    o 创建DOS分区表

    p 显示当前分区表(基本)

    q 退出,不保存更改

    s 为Sun Unix系统创建一个新磁盘标签

    t 修改分区的系统ID

    u 改变使用的存储单位

    v 验证分区表

    w 将分区表写入磁盘(基本)

    x 高级功能

[窍门] 有些发行版和较旧的发行版在生成新分区之后并不会自动提醒Linux系统。如果是这样的话,你要么使用partprob或hdparm命令(参考相应的手册页),要么重启系统,让系统读取更新过的分区表。

创建文件系统:

mkefs 创建一个ext文件系统

mke2fs 创建一个ext2文件系统

mkfs.ext3 创建一个ext3文件系统
mkfs.ext4 创建一个ext4文件系统

mkreiserfs 创建一个ReiserFS文件系统

jfs_mkfs 创建一个JFS文件系统

mkfs.xfs 创建一个XFS文件系统

mkfs.zfs 创建一个ZFS文件系统

mkfs.btrfs 创建一个Btrfs文件系统

    $:' sudo mkfs.ext4 /dev/sdb1

    // 为分区创建了文件系统之后,下一步是将它挂载到虚拟目录下的某个挂载点,这样就可以将数据存储在新文件系统中了。

    $:' ls /mnt

    $:' sudo mkdir /mnt/my_partition

    $:' ls -al /mnt/my_partition/

    $:' ls -dF /mnt/my_partition

    /mnt/my_partition/

    $:' sudo mount -t ext4 /dev/sdb1 /mnt/my_partition

    $:' ls -al /mnt/my_partition/

    total 24

    drwxr-xr-x. 3 root root 4096 Jun 11 09:53 .

    drwxr-xr-x. 3 root root 4096 Jun 11 09:58 ..

    drwx------. 2 root root 16384 Jun 11 09:53 lost+found

    // mkdir命令在虚拟目录中创建了挂载点, mount命令将新的硬盘分区添加到挂载点。 mount命令的-t选项指明了要挂载的文件系统类型(ext4)。现在你可以在新分区中保存新文件和目录了!

[窍门] 要想知道某个文件系统工具是否可用,可以使用type命令。例如:

    $:' type mkfs.ext4

    mkfs.ext4 is /sbin/mkfs.ext4

fsck 命令能够检查和修复大部分类型的Linux文件系统,命令格式:fsck options filesystem

    -a 如果检测到错误,自动修复文件系统

    -A 检查/etc/fstab文件中列出的所有文件系统

    -C 给支持进度条功能的文件系统显示一个进度条(只有ext2和ext3)

    -N 不进行检查,只显示哪些检查会执行

    -r 出现错误时提示

    -R 使用-A选项时跳过根文件系统

    -s 检查多个文件系统时,依次进行检查

    -t 指定要检查的文件系统类型

    -T 启动时不显示头部信息

    -V 在检查时产生详细输出

    -y 检测到错误时自动修复文件系统

linux逻辑卷管理:
vgchange 激活和禁用卷组
vgremove 删除卷组
vgextend 将物理卷加到卷组中
vgreduce 从卷组中删除物理卷
lvextend 增加逻辑卷的大小
lvreduce 减小逻辑卷的大小

通过使用这些命令行程序,就能完全控制你的Linux LVM环境。

>>第9章丶安装软件程序

dpkg命令会直接和Linux系统上的PMS交互,用来安装、管理和删除软件包。

dpkg命令是基于Debian系PMS工具的核心。包含在这个PMS中的其他工具有:

 apt-get (一般使用)

 apt-cache

 aptitude

显示包package_name的详情:

    $:' aptitude show package_name

所有跟某个特定软件包相关的所有文件的列表命令:

    $:' dpkg -L package_name

反向操作,查找某个特定文件属于哪个软件包:

    $:' dpkg --search absolute_file_name

用 aptitude 安装软件包命令:

    $:' aptitude search package_name

在系统上用aptitude从软件仓库中安装软件包:

    $:' sudo aptitudeinstall package_name

要用软件仓库中的新版本妥善地更新系统上所有的软件包:

    $:' sudo aptitude safe-upgrade

只删除软件包而不删除数据和配置文件,可以使用aptitude的remove选项:

    $:' sudo aptitude remove package_name

要删除软件包和相关的数据和配置文件,可用purge选项:

    $:' sudo aptitude purge package_name

aptitude默认的软件仓库位置存储在文件/etc/apt/sources. list中。

文件里满是帮助性的注释和警告。使用下面的结构来指定仓库源。

    $:' deb (or deb-src) address distribution_name package_type_list

    deb或deb-src的值表明了软件包的类型。

    deb值说明这是一个已编译程序源,而deb-src值则说明这是一个源代码的源。

    address条目是软件仓库的Web地址。

    distribution_name条目是这个特定软件仓库的发行版版本的名称。

    package_type_list条目可能并不止一个词,它还表明仓库里面有什么类型的包。

基于不同的系统使用不同的软件管理工具命令:

yum:在Red Hat和Fedora中使用。

urpm:在Mandriva中使用。

zypper:在openSUSE中使用。

>>第10章丶使用编辑器

vim编辑器

    $:' alias vi

    alias vi='vim'

    $:' which vim

    /usr/bin/vim

    $:' readlink -f /usr/bin/vi

    /usr/bin/vim.tiny

    // readlink –f 它能够立刻找出链接文件的最后一环。

    $:' sudo apt-get install vim

    $:' readlink -f /usr/bin/vi

    /usr/bin/vim.basic

vim 基本操作(略)。

vim 的查找和替换:

 :s/old/new/g:一行命令替换所有old。

 :n,ms/old/new/g:替换行号n和m之间所有old。

 :%s/old/new/g:替换整个文件中的所有old。

 :%s/old/new/gc:替换整个文件中的所有old,但在每次出现时提示。

GNOME编辑器
gedit文本编辑器是一个基本的文本编辑器,有一些出于兴趣加进去的高级功能。

2017.06.10

第一部分完... ...
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  shell 脚本 编程
相关文章推荐