课程 | 必修 | 选修 | 基本要求 |
---|---|---|---|
Shell编程 | 《Linux命令行与Shell脚本编程大全》 | 《Perl编程24学时教程》 | 熟练掌握Linux基本命令和使用,掌握grep、awk、sed、正则表达式等Shell编程 |
哈哈,时间提前,内容很多,26章,每天得完成4章才行,提前开始狂啃
day1
将硬件设备当成特殊的文件,称为设备文件。设备文件有3种分类:
+ 字符型设备文件
+ 块设备文件
+ 网络设备文件
不同于其他一些操作系统,Linux内核支持通过不同类型的文件系统从硬盘中读写数据。除
了自有的诸多文件系统外,Linux还支持从其他操作系统(比如Microsoft Windows)采用的文件
系统中读写数据。内核必须在编译时就加入对所有可能用到的文件系统的支持。表1-1列出了
Linux系统用来读写数据的标准文件系统。
GNU项目的主旨在于为Unix系统管理员设计出一套类似于Unix的环境。这个目标促使该项目
移植了很多常见的Unix系统命令行工具。供Linux系统使用的这组核心工具被称为coreutils(core
utilities)软件包。GNU coreutils软件包由三部分构成:
NU/Linux shell是一种特殊的交互式工具。它为用户提供了启动程序、管理文件系统中的文件以及运行在Linux系统上的进程的途径。 shell的核心是命令行提示符。
Linux系统启动后,它会自动创建出一些虚拟控制台。虚拟控制台是运行在Linux系统内存中
的终端会话。无需在计算机上连接多个哑终端,大多数Linux发行版会启动5~6个(有时会更多)
虚拟控制台,你在一台计算机的显示器和键盘上就可以访问它们。
inux发行版通常使用Ctrl+Alt组合键配合F1或F7来进入图形界面。Ubuntu使用F7,而RHEL则使用F1。
8种颜色可选
setterm –background white
black 、 red 、 green 、 yellow 、 blue 、 magenta 、 cyan、white
在一些Linux发行版的桌面环境中,例如
Ubuntu
的Unity
,可以使用快捷键Ctrl+Alt+T
快速访问GNOME终端
。
天天使用
命令 | 备注 |
---|---|
Ctrl+Shift+N |
创建一个新Terminal |
Copy Shift+Ctrl+C |
复制 |
Shift+Ctrl+V |
粘贴 |
大多数Linux发行版的默认shell都是GNU bash shell。
man
如果不记得命令名怎么办?可以使用关键字搜索手册页
man -k 关键字
大多数命令都可以接受
-help
或--help
选项
Linux
使用正斜线(/)
而不是反斜线(\)
在文件路径中划分目录。
如果没安装彩色终端仿真器,可用带 -F 参数的 ls 命令轻松区分文件和目录
ls -F
ls -a
ls -F -R
选项并不一定要像例子中那样分开输入: ls –F –R
。它们可以进行如下合并: ls –FR
显示更多的信息
ls -l
可以将多个参数结合起来使用。不仅能够显示出所需的内容,而且还容易记忆,例如 ls –alF
过滤器就是一个进行简单文本匹配的字符串。当用户指定特定文件的名称作为过滤器时,
ls
命令只会显示该文件的信息。
ls -l my_script
ls -l my_scr?pt
特定位置上可能出现的两种字符: a 或 i
ls -l my_scr[ai]pt
字母范围 [a – i]
ls -l f[a-i]ll
感叹号(!)将不需要的内容排除在外。
ls -l f[!a]ll
touch test_one
cp source destination
默认不会提示,加上-i提示覆盖
cp -i test_one test_two
可以使用
ln
命令以及-s
选项来
创建符号链接
$ ls -l data_file
-rw-rw-r-- 1 christine christine 1092 May 21 17:27 data_file
$
$ ln -s data_file sl_data_file
$
$ ls -l *data_file
-rw-rw-r-- 1 christine christine 1092 May 21 17:27 data_file
lrwxrwxrwx 1 christine christine
9 May 21 17:29 sl_data_file -> data_file
证明链接文件是独立文件的方法是查看inode编号
$ ls -i *data_file
296890 data_file 296891 sl_data_file
硬链接会创建独立的虚拟文件,只不过这次使用 ln 命令时不再需要加入额外的参数了
$ ls -l code_file
-rw-rw-r-- 1 christine christine 189 May 21 17:56 code_file
$
$ ln code_file hl_code_file
$
$ ls -li *code_file
296892 -rw-rw-r-- 2 christine christine 189 May 21 17:56
code_file
296892 -rw-rw-r-- 2 christine christine 189 May 21 17:56
hl_code_file
复制链接文件的时候一定要小心。如果使用 cp 命令复制一个文件,而该文件又已经被链接
到了另一个源文件上,那么你得到的其实是源文件的一个副本。这很容易让人犯晕。
注意,带有硬链接的文件共享inode编号。这是因为它们终归是同一个文件。
在Linux中,重命名文件称为移动(moving)。
mv
命令可以将文件和目录移动到另一个位置
或重新命名。
mv fall fzll
注意:移动文件会将文件名从fall更改为fzll,但inode编号和时间戳保持不变。这是因为 mv只影响文件名。
窍门:cp 命令类似,也可以在 mv 命令中使用 -i参数 。这样在命令试图覆盖已有的文件时,你就会得到提示
在Linux中,删除(
deleting
)叫作移除(removing
)
rm -i fall
rm
命令的另外一个特性是,如果要删除很多文件且不受提示符的打扰,可以用 -f
参数强制删除。小心为妙!
rmdir New_Dir
cat test1
-n 参数会给所有的行加上行号
cat -n test1
只给有文本的行加上行号,可以用 -b 参数给有文本的行加上行号,可以用 -b 参数
cat -b test1
如果不想让制表符出现,可以用 -T 参数
cat -T test1
cat 或 more 加载完整个文件之后才能看到
tail 命令会显示文件最后几行的内容(文件的“尾部”)。默认情况下,它会显示文件的末尾10行。
cat log_file
通过加入 -n 2 使tail 命令只显示文件的最后两行
tail -n 2 log_file
类似于 tail 命令,它也支持 -n 参数,这样就可以指定想要显示的内容了。这两个命令都允许你在破折号后面输入想要显示的行数
head -5 log_file
ps -l
UID:启动这些进程的用户。
注意使用了 -l 参数之后多出的那些列。
top
PID:进程的ID。
kill PID
killall http*
mount -t type device directory
, mount -t vfat /dev/sdb1 /media/disk
umount [directory | device ]
umount /home/rich/mnt
df 命令 获取设备上还有多少磁盘空间
说明 Linux系统后台一直有进程来处理文件或使用文件。 df 命令的输出值显示的是Linux系统认为的当前值。有可能系统上有运行的进程已经创建或删除了某个文件,但尚未释放文件。这个值是不会算进闲置空间的。
du 命令可以显示某个特定目录(默认情况下是当前目录)的磁盘使用情况。这一方法可用来快速判断系统上某个目录下是不是有超大文件。
处理数据文件
cat file1
sort
命令把数字识别成数字
而不是字符 sort -n file2
|
)将 du
命令的输出重定向到 sort
命令。搜索数据 grep [options] pattern [file]
在文件 file1 中搜索能匹配模式 three 的文本
grep three file1
反向搜索
grep -v t file1
gzip 用来压缩文件
gzip myprog
tar 命令
tar function [options] object1 object2 ...
下载了开源软件之后,你会经常看到文件名以.tgz结尾。这些是 gzip 压缩过的tar文件可以用命令 tar -zxvf filename.tgz 来解压。
day2
/bin/dash
在CLI提示符后输入 /bin/bash 命令或其他等效的 bash 命令时,会创建一个新的shell程序。这个shell程序被称为子shell(child shell)。子shell也拥有CLI提示符,同样会等待命令输入。
输入
exit
来退出dash shell
说明:
进程就是正在运行的程序。
bash shell
是一个程序,当它运行的时候,就成为了一个进程。一个运行着的shell
就是某种进程而已。因此,在说到运行一个bash shell
的时候,你经常会看到“shell”
和“进程”
这两个词交换使用。
sleep 10
暂停10秒钟,然后返回shell CLI提示符jobs
命令来显示后台作业信息协程可以同时做两件事。它在后台生成一个子shell,并在这个子shell中执行命令
coproc sleep 10
扩展写法,协程的名字被设置成
My_Job
coproc My_Job { sleep 10; }
协程能够让你尽情发挥想象力,发送或接收来自子shell中进程的信息。只有在拥有多个协程的时候才需要对协程进行命名,因为你得和它们进行通信。否则的话,让 coproc 命令将其设置成默认的名字 COPROC 就行了
coproc ( sleep 10; sleep 2 )
生成子shell的成本不低,而且速度还慢。创建嵌套子shell更是火上浇油
当外部命令执行时,会创建出一个子进程。这种操作被称为衍生(forking)。外部命令 ps 很方便显示出它的父进程以及自己所对应的衍生子进程。
就算衍生出子进程或是创建了子shell,你仍然可以通过发送信号与其沟通,这一点无论是在命令行还是在脚本编写中都是极其有用的。发送信号(signaling)使得进程间可以通过信号进行通信。
cd 和 exit 命令都内建于bash shell
$ type cd
cd is a shell builtin
$
$ type exit
exit is a shell builtin
因为既不需要通过衍生出子进程来执行,也不需要打开程序文件,内建命令的执行速度要更快,效率也更高
例如 echo 和 pwd 既有内建命令也有外部命令。两种实现略有不同。要查看命令的不同实现,使用 type 命令的 -a 选项
对于有多种实现的命令,如果想要使用其外部命令实现,直接指明对应的文件就可以了。例如,要使用外部命令 pwd ,可以输入 /bin/pwd
如果你打开了多个终端会话,仍然可以使用
history -a
命令在打开的会话中向.bash_history
文件中添加记录。但是对于其他打开的终端会话,历史记录并不会自动更新。这是因为.bash_history
文件只有在打开首个终端会话时才会被读取。要想强制重新读取.bash_history
文件,更新终端会话的历史记录,可以使用下面命令。
history -n
printenv
printenv HOME
env HOME
set
命令会显示为某个特定进程设置的所有环境变量命令
env
、printenv
和set
之间的差异很细微。set
命令会显示出全局变量、局部变量以及用户定义变量。它还会按照字母顺序对结果进行排序env
和printenv
命令同set
命令的区别在于前两个命令不会对变量排序,也不会输出局部变量和用户定义变量。在这种情况下,env
和printenv
的输出是重复的。不过env
命令有一个printenv
没有的功能,这使得它要更有用一些。
$ echo $my_variable
$ my_variable=Hello
$
$ echo $my_variable
Hello
窍门:
所有的环境变量名均使用大写字母,这是bash shell的标准惯例。如果是你自己创建的局部变量或是shell脚本,请使用小写字母。变量名区分大小写。在涉及用户定义的局部变量时坚持使用小写字母,这能够避免重新定义系统环境变量可能带来的灾难。
$ my_variable="I am Global now"
$
$ export my_variable
$
$ echo $my_variable
I am Global now
$
$ bash
$
$ echo $my_variable
I am Global now
$
$ exit
exit
$
$ echo $my_variable
I am Global now
修改子shell中全局环境变量并不会影响到父shell中该变量的值,子shell甚至无法使用 export 命令改变父shell中全局环境变量的值
$ echo $my_variable
I am Global now
$ unset my_variable
$ echo $my_variable
如果你是在子进程中删除了一个全局环境变量,这只对子进程有效。该全局环境变量在父进程中依然可用
echo $PATH
当你登录
Linux
系统时,bash shell
会作为登录shell
启动。登录shell
会从5个不同的启动文件里读取命令:
/etc/profile
$HOME/.bash_profile
$HOME/.bashrc
$HOME/.bash_login
$HOME/.profile
/etc/profile
文件是系统上默认的bash shell
的主启动文件。系统上的每个用户登录时都会执行这个启动文件。
如果bash是作为交互式
shell
启动的,它就不会访问/etc/profile
文件,只会检查用户HOME
目录中的.bashrc
文件
系统执行
shell
脚本时用的就是这种shell
。不同的地方在于它没有命令行提示符。但是当你在系统上运行脚本时,也许希望能够运行一些特定启动的命令。
在大多数发行版中,存储个人用户永久性bash shell变量的地方是$HOME/.bashrc文件。这一
点适用于所有类型的shell进程。
$ mytest=(one two three four five)
$ echo $mytest
one
$ echo ${mytest[2]}
three
Linux系统使用一个专门的文件来将用户的登录名匹配到对应的UID值
cat /etc/passwd
现在,绝大多数Linux系统都将用户密码保存在另一个单独的文件中(叫作shadow文件,位置
在/etc/shadow)。只有特定的程序(比如登录程序)才能访问这个文件。
/etc/shadow文件对Linux系统密码管理提供了更多的控制。只有root用户才能访问/etc/shadow文件,这让它比起/etc/passwd安全许多在/etc/shadow文件的每条记录中都有9个字段:
/usr/sbin/useradd -D
/usr/sbin/userdel -r test
在有大量用户的环境中使用 -r 参数时要特别小心。你永远不知道用户是否在其HOME目录下存放了其他用户或其他程序要使用的重要文件。记住,在删除用户的HOME目录之前一定要检查清楚!
usermod 命令是用户账户修改工具中最强大的一个
passwd 和 chpasswd改变用户密码的一个简便方法就是用 passwd 命令
passwd username
chsh -s /bin/csh username
finger 命令可以非常方便地查看Linux系统上的用户信息
finger username
出于安全性考虑,很多Linux系统管理员会在系统上禁用 finger 命令,不少Linux发行版甚至都没有默认安装该命令。
用户账户在控制单个用户安全性方面很好用,但涉及在共享资源的一组用户时就捉襟见肘
了。为了解决这个问题,Linux系统采用了另外一个安全概念——组(group)。
与用户账户类似,组信息也保存在系统的一个文件中。/etc/group文件包含系统上用到的每个
组的信息。
root:x:0:root
bin:x:1:root,bin,daemon
daemon:x:2:root,bin,daemon
sys:x:3:root,bin,adm
adm:x:4:root,adm,daemon
rich:x:500:
mama:x:501:
katie:x:502:
jessica:x:503:
mysql:x:27:
test:x:504:
/etc/group文件有4个字段:
用户账户列表某种意义上有些误导人。你会发现,在列表中,有些组并没有列出用户。这并不是说这些组没有成员。当一个用户在/etc/passwd文件中指定某个组作为默认组时,用户账户不会作为该组成员再出现在/etc/group文件中。多年以来,被这个问题难倒的系统管理员可不是一两个呢。
/usr/sbin/groupadd shared
/usr/sbin/usermod -G shared rich
/usr/sbin/groupmod -n sharing shared
两个修改权限的方式
chmod
,umask
chmod options mode file
chmod 760 newfile
umask 002
chown
命令用来改变文件的属主,chgrp
命令用来改变文件的默认属组。
chown options owner[.group] file
chown dan newfile
chgrp shared newfile
SGID位置位
umask 002
如果更改了已登录系统账户所属的用户组,该用户必须登出系统后再登录,组关系的更改才能生效。
ext
文件系统扩展文件系统 (extended filesystem,简记为ext),ext文件系统采用名为索引节点的系统来存放虚拟目录中所存储文件的信息
ext2
文件系统最早的ext文件系统有不少限制,比如文件大小不得超过
2 GB
。在Linux出现后不久,ext文件
系统就升级到了第二代扩展文件系统,叫作ext2。ext2文件系统还将允许的最大文件大小增加到了2 TB
(在ext2的后期版本中增加到了32 TB
),以容纳数据库服务器中常见的大文件。
数据模式日志方法是目前为止最安全的数据保护方法,但同时也是最慢的。所有写到存储设
备上的数据都必须写两次:第一次写入日志,第二次写入真正的存储设备。这样会导致性能很差,
尤其是对要做大量数据写入的系统而言。
2001年,ext3文件系统被引入Linux内核中,直到最近都是几乎所有Linux发行版默认的文件
系统。它采用和ext2文件系统相同的索引节点表结构,但给每个存储设备增加了一个日志文件,
以将准备写入存储设备的数据先记入日志。
扩展ext3文件系统功能的结果是ext4文件系统(你可能也猜出来了)。ext4文件系统在2008年受到Linux内核官方支持,现在已是大多数流行的Linux发行版采用的默认文件系统,比如
Ubuntu
。
ext4还引入了块预分配技术(block preallocation)。如果你想在存储设备上给一个你知道要变
大的文件预留空间,ext4文件系统可以为文件分配所有需要用到的块,而不仅仅是那些现在已经
用到的块。ext4文件系统用 0 填满预留的数据块,不会将它们分配给其他文件。
2001年,Hans Reiser为Linux创建了第一个称为ReiserFS的日志文件系统。ReiserFS文件系统只支持回写日志模式——只把索引节点表数据写到日志文件。 ReiserFS文件系统也因此成为Linux
上最快的日志文件系统之一。
作为可能依然在用的最老的日志文件系统之一,JFS(Journaled File System,日志化文件系
1统 )是IBM在1990年为其Unix衍生版AIX开发的。
XFS日志文件系统是另一种最初用于商业Unix系统而如今走进Linux世界的文件系统。美国
硅图公司(SGI)最初在1994年为其商业化的IRIX Unix系统开发了XFS。2002年,它被发布到了
适用于Linux环境的版本。
COW文件系统ZFS是由Sun公司于2005年研发的,用于OpenSolaris操作系统,从2008年起开
始向Linux移植,最终在2012年投入Linux产品的使用。
Btrfs文件系统是COW的新人,也被称为B树文件系统。它是由Oracle公司于2007年开始研发
的。Btrfs在Reiser4的诸多特性的基础上改进了可靠性。另一些开发人员最终也加入了开发过程,
帮助Btrfs快速成为了最流行的文件系统。
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 | 高级功能 |
如果这是你第一次给该存储设备分区, fdisk 会警告你设备上没有分区表。
创建文件系统的命令行程序
sudo mkfs.ext4 /dev/sdb1
sudo mount -t ext4 /dev/sdb1
工具 | 用途 |
---|---|
mkefs | 创建一个ext文件系统 |
mke2fs | 创建一个ext2文件系统 |
mkfs.ext3 | 创建一个ext3文件系统 |
mkfs.ext4 | 创建一个ext4文件系统 |
mkreiserfs | 创建一个ReiserFS文件系统 |
jfs_mkfs | 创建一个JFS文件系统 |
mkfs.xfs | 创建一个XFS文件系统 |
mkfs.zfs | 创建一个ZFS文件系统 |
mkfs.btrfs | 创建一个Btrfs文件系统 |
这种挂载文件系统的方法只能临时挂载文件系统。当重启Linux系统时,文件系统并不会自动挂载。要强制Linux在启动时自动挂载新的文件系统,可以将其添加到/etc/fstab文件。
fsck options filesystem
fsck 的命令行选项
选项 | 描述 |
---|---|
-a | 如果检测到错误,自动修复文件系统 |
-A | 检查/etc/fstab文件中列出的所有文件系统 |
-C | 给支持进度条功能的文件系统显示一个进度条(只有ext2和ext3) |
-N | 不进行检查,只显示哪些检查会执行 |
-r | 出现错误时提示 |
-R | 使用 -A 选项时跳过根文件系统 |
-s | 检查多个文件系统时,依次进行检查 |
-t | 指定要检查的文件系统类型 |
-T | 启动时不显示头部信息 |
-V | 在检查时产生详细输出 |
-y | 检测到错误时自动修复文件系统 |
只能在未挂载的文件系统上运行 fsck 命令。对大多数文件系统来说,你只需卸载文件系
统来进行检查,检查完成之后重新挂载就好了。但因为根文件系统含有所有核心的Linux
命令和日志文件,所以你无法在处于运行状态的系统上卸载它。
尽管日志式文件系统的用户需要用到 fsck 命令,但是COW文件系统的用户是否也得使用该命令还存在争议。实际上,ZFS文件系统甚至都没有提供 fsck 工具的接口
逻辑卷管理的核心在于如何处理安装在系统上的硬盘分区。在逻辑卷管理的世界里,硬盘称
作物理卷(physical volume
,PV
)
分区来创建实际的物理卷。这可以通过 pvcreate 命令来完成
sudo pvcreate /dev/sdb1
可以使用 pvdisplay 命令来显示已创建的物理卷列表
sudo pvdisplay /dev/sdb1
命令行创建卷组,需要使用 vgcreate 命令
sudo vgcreate Vol1 /dev/sdb1
要创建逻辑卷,使用 lvcreate 命令
sudo lvcreate -l 100%FREE -n lvtest Vol1
运行完 lvcreate 命令之后,逻辑卷就已经产生了,但它还没有文件系统。你必须使用相应
的命令行程序来创建所需要的文件系统。
sudo mkfs.ext4 /dev/Vol1/lvtest
可以用标准Linux mount 命令将这个卷挂载到虚拟目录中,就
跟它是物理分区一样
sudo mount /dev/Vol1/lvtest /mnt/my_partition
命令 | 功能 |
---|---|
vgchange | 激活和禁用卷组 |
vgremove | 删除卷组 |
vgextend | 将物理卷加到卷组中 |
vgreduce | 从卷组中删除物理卷 |
lvextend | 增加逻辑卷的大小 |
lvreduce | 减小逻辑卷的大小 |
通过使用这些命令行程序,就能完全控制你的Linux LVM环境
day3
aptitude
dpkg -L package_name
dpkg -L vim-common
aptitude safe-upgrade
要想只删除软件包而不删除数据和配置文件,可以使用 aptitude 的remove 选项。要删除软件包和相关的数据和配置文件,可用 purge 选项。
sudo aptitude purge wine
常见的前端工具
列出已安装包
yum list installed
yum list updates
yum update
只删除软件包而保留配置文件和数据文件,就用如下命令:
yum remove package_name
要删除软件和它所有的文件,就用 erase 选项:
yum erase package_name
试试下面的命令:
yum clean all
然后试着用 yum 命令的 update 选项。有时,只要清理了放错位置的文件就可以了。如果这还解决不了问题,试试下面的命令:
yum deplist package_name
如果这样仍未解决问题,还有最后一招:
yum update --skip-broken
–skip-broken 选项允许你忽略依赖关系损坏的那个包,继续去更新其他软件包。这可能救不了损坏的包,但至少可以更新系统上的其他包。
聪明的系统管理员会坚持使用通过审核的仓库。通过审核的仓库是指该发行版官方网站上指定的库。如果你添加了未通过审核的库,就失去了稳定性方面的保证,可能陷入损坏的依赖关系惨剧中
命令 | 描述 |
---|---|
x | 删除当前光标所在位置的字符 |
dd | 删除当前光标所在行 |
dw | 删除当前光标所在位置的单词 |
d$ | 删除当前光标所在位置至行尾的内容 |
J | 删除当前光标所在行行尾的换行符(拼接行) |
u | 撤销前一编辑命令 |
a | 在当前光标后追加数据 |
A | 在当前光标所在行行尾追加数据 |
r char | 用 char 替换当前光标所在位置的单个字符 |
R text | 用 text 覆盖当前光标所在位置的数据,直到按下ESC键 |
在vim编辑器的普通模式下使用退格键(Backspace键)和删除键(Delete键)时要留心。vim编辑器通常会将删除键识别成 x 命令的功能,删除当前光标所在位置的字符。vim编辑器在普通模式下通常不识别退格键。
vim是一款复杂的编辑器,功能强大,而nano就简单多了。作为一款简单易用的控制台模式文本编辑器,nano很适合对此类编辑器有需求的用户。对Linux命令行新手来说,它用起来也很不错。
nano myprog.c
尽管nano控制命令在列出组合键的时候使用的是大写字母,但是在使用的时候,大小写字母都没有问题。
nano控制命令
命令 | 描述 |
---|---|
CTRL+C | 显示光标在文本编辑缓冲区中的位置 |
CTRL+G | 显示nano的主帮助窗口 |
CTRL+J | 调整当前文本段落 |
CTRL+K | 剪切文本行,并将其保存在剪切缓冲区 |
CTRL+O | 将当前文本编辑缓冲区的内容写入文件 |
CTRL+R | 将文件读入当前文本编辑缓冲区 |
CTRL+T | 启动可用的拼写检查器 |
CTRL+U | 将剪切缓冲区中的内容放入当前行 |
CTRL+V | 翻动到文本编辑缓冲区中的下一页内容 |
CTRL+W | 在文本编辑缓冲区中搜索单词或短语 |
CTRL+X | 关闭当前文本编辑缓冲区,退出nano,返回shell |
CTRL+Y | 翻动到文本编辑缓冲区中的上一页内容 |
如果你输入Ctrl+T命令使用nano的拼写检查器的时候得到了错误消息 Spell checking failed: Error invoking ‘Spell’ ,下面是一些解决方法。利用第9章中学到的知识,在你使用的Linux发行版中安装拼写检查器软件包aspell。如果aspell没能解决问题,以超级用户的身份编辑/etc/nanorc文件(使用你喜欢的文本编辑器)。找到文件的最后一行 # set speller “aspell -x -c” ,删除行首的字符 # 。保存并退出。
创建test1,输入下面,保存
#!/bin/bash
# This script displays the date and who's logged on
date
who
加权限
chmod u+x test1
运行
sudo ./test1
$ echo This is a test
This is a test
$
#!/bin/bash
# copy the /usr/bin directory listing to a log file
today=$(date +%y%m%d)
ls /usr/bin -al > log.$today
date +%y%m%d
目录中出现的日志文件采用 $today 变量的值作为文件名的一部分。日志文件的内容是/usr/bin目录内容的列表输出。如果脚本在明天运行,日志文件名会是log.180506,就这样为新的一天创建一个新文件。
命令替换会创建一个子shell来运行对应的命令。子shell ( subshell)是由运行该脚本的shell所创建出来的一个独立的子shell(child shell)。正因如此,由该子shell所执行命令是无法使用脚本中所创建的变量的。在命令行提示符下使用路径 ./ 运行命令的话,也会创建出子shell;要是运行命令的时候不加入路径,就不会创建子shell。如果你使用的是内建的shell命令,并不会涉及子shell。在命令行提示符下运行脚本时一定要留心!
command > outputfile
command < inputfile
管道被放在命令之间,将一个命令的输出重定向到另一个命令中:
command1 | command2
$ date
Sat Jan 15 10:01:30 EDT 2014
$ echo $?
0
$
if command
then
commands
fi
bash shell的 if 语句会运行 if 后面的那个命令。如果该命令的退出状态码(参见第11章)是 0(该命令成功运行),位于 then 部分的命令就会被执行。如果该命令的退出状态码是其他值,部分的命令就不会被执行,bash shell会继续执行脚本中的下一个命令。 fi 语句用来表示 if-then语句到此结束。
if command
then
commands
else
commands
fi
test condition
if [ test19.sh -nt test18.sh ]
day4
for var in list
do
commands
done
while test command
do
other commands
done
until test commands
do
other commands
done
有时你在内部循环,但需要停止外部循环。 break 命令接受单个命令行参数值
break n
其中 n 指定了要跳出的循环层级。默认情况下, n 为 1 ,表明跳出的是当前的循环。
和 break 命令一样, continue 命令也允许通过命令行参数指定要继续执行哪一级循环:
continue n
IFS=:
for folder in $PATH
do
day5
day6
day7