1 背景知识
1.1 GNU计划
GNU计划,又称革奴计划,是由Richard
Stallman在1983年9月27日公开发起的。它的目标是创建一套完全自由的操作系统。Richard Stallman最早是在net.unix-wizards新闻组上公布该消息,并附带《GNU宣言》等解释为何发起该计划的文章,其中一个理由就是要“重现当年软件界合作互助的团结精神”。为保证GNU软件可以自由地“使用、复制、修改和发布”,所有GNU软件都有一份在禁止其他人添加任何限制的情况下授权所有权利给任何人的协议条款,GNU通用公共许可证(GNU General Public License,GPL)。即“反版权”(或称Copyleft)概念。
1.2 Shell
shell是运行在终端中的文本互动程序,bash(GNU Bourne-Again Shell)是最常用的一种shell。是当前大多数Linux发行版的默认Shell。
Shell相当于是一个翻译,把我们在计算机上的操作或我们的命令,翻译为计算机可识别的二进制命令,传递给内核,以便调用计算机硬件执行相关的操作;同时,计算机执行完命令后,再通过Shell翻译成自然语言,呈现在我们面前。
1.3 Bash(Bourne-Again Shell)简介
bash的全名是Bourne
Again Shell。最开始在Unix系统中流行的是sh,而bash作为sh的改进版本,提供了更加丰富的功能。一般来说,都推荐使用bash作为默认的Shell。
bash是GNU组织开发和推广的一个项目,是对Bourne shell的扩展。
Bourne shell是 UNIX 最初使用的 Shell,作者Steven Bourne。bash是许多Linux平台的内定Shell,传统UNIX上还有许多Shell,包括tcsh、csh、ash、bsh、ksh。Shell Script大致都类同,一个Shell Script通常可以在很多种Shell上使用。
狭义的Shell指的就是命令行终端
shell的作用:用户输入指令,通过Shell和内核沟通,控制硬件正常工作
2. 基本语法 General syntax of a shell command
2.1 根目录 Home Directory
文件目录树:
2.2 获取帮助 The --help option
ls –help
2.3 获取当前目录路径 pwd
pwd 显示当前目录路径
2.4 显示当前目录下文件
ls
ls -l
ls -s
2.5 cd 切换目录
2.6 相对路径和绝对路径 Absolute vs Relative Paths
cd .
cd /
cd /home/amanda
cd ../..
cd ~
cd home
cd ~/data/..
cd
cd ..
2.7 命令补齐(Command-Line Completion)
Tab键
2.8 新建目录 mkdir
Mkdir -p : 自动生成文件补录
ls -FR :遍历
ls 文件夹名称:
ls -r :文件夹下得所有文件遍历
命名习惯:文件名不要出现空格、
2.9 文本编辑器
Nano filename:文件编辑器
Ctrl+o
Ctrl+x 退出
2.10 touch 新建文件:
2.11 more 查看文件内容
less 文件: less同样是是查看文档的命令
less=more
梗:less is more!
2.12 mv 移动文件
Mv 移动文件目录至新的目录
2.13 cp 复制
cp -r file1 /files2: 复制文件夹下所有问价到另一个文件
vi -d file1 file2 :查看两个文件的差别
cp 复制多个文件
2.14 rm 删除
rm file:删除文件
2.14 rm -i files: 互动式的删除
2.15 history 命令历史记录
history
history n: 显示最近N次的命令
2.16 alias 命令别名
alias goconfig='cd
/usr/X11/lib/X11/fvwm/sample-configs'
unalias goconfig #删除别名
2.17 管道
可以把一系列命令连接起来。这意味着第一个命令的输出会通过管道传给第二个命令而作为第二个命令的输入,第二个命令的输出又会作为第三个命令的输入。
cat sample.text |grep "High" | wc -l
这个管道将把 cat 命令(列出一个文件的内容)的输出送给grep命令。grep 命令在输入里查找单词 High,grep命令的输出则是所有包含单词 High的行,这个输出又被送给 wc命令。带 -l选项的 wc命令将统计输入里的行数。
2.18 提示符
bash 有两级用户提示符。第一级是你经常看到的 bash 在等待命令输入时的提示符。缺省的一级提示符是字符$(如果是超级用户,则是#号)。
2.19 作业控制(Job Control)
control-z
bg
# find 命令首先被挂起,再在后台继续被执行,并且你能马上回到bash下。
#按下 Ctrl-Z 使一个运行的进程挂起。bg 命令使一个被挂起的进程在后台恢复运行,反之 fg 命令使进程在前台恢复运行。
2.20 Wildcards 通配符
*代表多个未知字符
?代表只匹配个未知字符
* matches zero or more characters in afilename, so *.txt matches all files ending in .txt.
? matches any single character in afilename, so ?.txt matches a.txt but not any.txt.
总结1:
cp [old] [new] copies a file.
mkdir [path] creates a new directory.
mv [old] [new] moves (renames) a file ordirectory.
rm [path] removes (deletes) a file.
2.21 wc 计数工具
wc file:
字符数,单词数,和行数
wc *.pdb : total计算总的项目
wc -l *.pdb: 查看行数
wc -w
wc -m file:
wc -l *.pdb > new_file: 输出重定向,将输出的内容保存到一个文件中。文件名可能被覆盖
wc -l *.pdb >> new_file: 输出结果加在结尾,不覆盖原来文件。
输入重定向wc -l *.pdb > new_file
wc test #如果你输入一个文件名做参数,象下面的例子一样,wc 将返回文件所包含的字符数,单词数,和行数:
wc < test:# < 符号在bash里用于把当前命令的输入重定向为指定的文件。所以可以用下面的命令来把wc 命令的输入重定向为test 文件:
2.22 输出重定向
当你要把 ls 命令的输出保存为一个名为 directory.out 的文件时,你可以使用下面的命令:
ls >directory.out
2.23 cat
查看文件内容和>>连接两个文件内容
cat file
cat length1.txt >> new_length
单"> "和">>"的差别#
2.24 sort file: 排序文件中的内容
1. sort newfile 安装首字符中的空格数量、首字母来排序
12
9
15
20
…
2. sort -n new file:安装数字大小来排序
sort -n le
2.25 head -n 查看文件的前几行
2.26 tail -n 查看文章结尾
2.27 echo 显示一个文件
echo hello > testfile.txt #
echo hello >> testfile.txt #
2.28 Pipe | 管道
# sort -n length.txt | head -n 1 #管道符号,将上一个结果作为下一个程序的输入文件
sort -n length.txt | head -n 4 |
tail -n 1 #输出第4个行
sort -n length.txt | head -n 4 | tail -n 1 >
4_line.txt #输出到文本
2.29 Loops 循环
#for thing in list_of_things
#do
# operation_using$thing
#done
例子1:
for filename in file1 files2 files
do
head-n 2 $filename |tail -n 1
done
例子2: 查看三个文件中的第二行的结果
$ for file in basilisk.dat minotaur.dat unicorn.dat; do echo $file; echo file; head -n 2 $file | tail -n 1; done
结果输出:
basilisk.dat
file
CLASSIFICATION: basiliscus vulgaris
minotaur.dat
file
CLASSIFICATION: bos hominus
unicorn.dat
file
CLASSIFICATION: equus monoceros
注意:
# $file 表示这个变量的值,而echo
file只显示这个变量本身的名称;
例子3:
$ for file in*.dat; do echo $file; echo file; head -n 2 $file | tail -n 1; done
do
echo$file
head-n 100 $file | tail -n 20
done
# 需要有echo 去获取变量名,而不是需要这个变量本身
例子4:
for filename in "red dragon.dat" "purple unicorn.dat"
# 避免因为文件名空格导致的读取误