Linux和Shell教程


参考

软件下载参考

  • 参考:https://www.centos.org/download/
  • 参考:Cloud Studio
    基于浏览器的集成式开发环境,支持绝大部分编程语言,包括 HTML5、PHP、Python、Java、Ruby、C/C++、.NET 等等,无需下载安装程序,一键切换开发环境。 Cloud Studio 提供了完整的 Linux 环境,并且支持自定义域名指向,动态计算资源调整,可以完成各种应用的开发编译与部署。

日志

  • 2022年10月06日11:16:12 补充常用Linux命令参考工具

1、Linux基础

1.1 Liunx 文件基本属性

在Linux中我们可以使用ll或者ls –l命令来显示一个文件的属性以及文件所属的用户和组,如:

[root@www /]# ls -l
total 64
-rw------- 1 root root       2696 Jan  2  2018 .xsession-errors.old
drwxr-xr-x 2 root root 4096 Jan 2 2018 Desktop
drwx------ 2 root root 4096 Jan 2 2018 Documents
drwxr-xr-x 2 root root 4096 May 5 2010 bin
-rw-r--r-- 1 root root 1 Sep 3 11:50 dwcr_table.txt
drwxr-xr-x 5 root root 4096 Jan 2 2018 inst-sys
drwxr-xr-x 7 root root 4096 Aug 1 09:44 mateinfo-all-install
-rw-r----- 1 root root 2827433725 Jul 28 14:17 mateinfo-all-install_201807121802.tar.gz

实例中,bin文件的第一个属性用"d"表示。"d"在Linux中代表该文件是一个目录文件。

在Linux中第一个字符代表这个文件是目录、文件或链接文件等等。

  • 当为[ d ]则是目录
  • 当为[ - ]则是文件;
  • 若是[ l ]则表示为链接文档(link file);
  • 若是[ b ]则表示为装置文件里面的可供储存的接口设备(可随机存取装置);
  • 若是[ c ]则表示为装置文件里面的串行端口设备,例如键盘、鼠标(一次性读取装置)。

接下来的字符中,以三个为一组,且均为『rwx』 的三个参数的组合。其中,[ r ]代表可读(read)、[ w ]代表可写(write)、[ x ]代表可执行(execute)。 要注意的是,这三个权限的位置不会改变,如果没有权限,就会出现减号[ - ]而已。

每个文件的属性由左边第一部分的10个字符来确定(如下图)。

从左至右用0-9这些数字来表示。

  1. 第0位确定文件类型
  2. 第1-3位确定属主(该文件的所有者)拥有该文件的权限(确定该文件的所有者对文件的权限 owner)。
  3. 第4-6位确定属组(所有者的同组用户)拥有该文件的权限(确定所有者的同组用户拥有该文件的权限 group)。
  4. 第7-9位确定其他用户拥有该文件的权限。
  • 其中,第1、4、7位表示读权限,如果用"r"字符表示,则有读权限,如果用"-"字符表示,则没有读权限;
  • 第2、5、8位表示写权限,如果用"w"字符表示,则有写权限,如果用"-"字符表示没有写权限;
  • 第3、6、9位表示可执行权限,如果用"x"字符表示,则有执行权限,如果用"-"字符表示,则没有执行权限。

1.2 Liunx 文件属主和属组

[root@www /]# ls -l
total 64
drwxr-xr-x 2 root  root  4096 Feb 15 14:46 cron
drwxr-xr-x 3 mysql mysql 4096 Apr 21  2014 mysql
……

对于文件来说,它都有一个特定的所有者,也就是对该文件具有所有权的用户。同时,在Linux系统中,用户是按组分类的,一个用户属于一个或多个组。文件所有者以外的用户又可以分为文件所有者的同组用户和其他用户。因此,Linux系统按文件所有者、文件所有者同组用户和其他用户来规定了不同的文件访问权限。

在以上实例中,mysql 文件是一个目录文件,属主和属组都为 mysql,属主有可读、可写、可执行的权限;与属主同组的其他用户有可读和可执行的权限;其他用户也有可读和可执行的权限。

对于 root 用户来说,一般情况下,文件的权限对其不起作用。

1)chgrp:更改文件属组

chgrp [-R] 属组名 文件名
  • 参数选项 -R:递归更改文件属组,就是在更改某个目录文件的属组时,如果加上-R的参数,那么该目录下的所有文件的属组都会更改。

2)chown:更改文件属主,也可以同时更改文件属组

chown [–R] 属主名 文件名
chown [-R] 属主名:属组名 文件名
  • 参数选项-R:递归更改文件属组,就是在更改某个目录文件的属组时,如果加上-R的参数,那么该目录下的所有文件的属组都会更改。

3)chmod:更改文件9个属性

  1. Linux文件属性有两种设置方法,一种是数字一种是符号
  2. Linux文件的基本权限就有九个,分别是owner/group/others三种身份各有自己的read/write/execute权限。

方式一(数字类型改变文件权限)

先复习一下刚刚上面提到的数据:文件的权限字符为:『-rwxrwxrwx』, 这九个权限是三个三个一组的!其中,我们可以使用数字来代表各个权限,各权限的分数对照表如下:

  • r: 4
  • w: 2
  • x: 1

每种身份(owner/group/others)各自的三个权限(r/w/x)分数是需要累加的,例如当权限为: [-rwxrwx---] 分数则是:

  • owner = rwx = 4+2+1 = 7
  • group = rwx = 4+2+1 = 7
  • others= --- = 0+0+0 = 0

  所以等一下我们设定权限的变更时,该文件的权限数字就是770啦!变更权限的指令chmod的语法是这样的:

chmod [-R] xyz 文件或目录

选项与参数:

  • xyz : 就是刚刚提到的数字类型的权限属性,为 rwx 属性数值的相加。
  • -R : 进行递归(recursive)的持续变更,亦即连同次目录下的所有文件都会变更。

方式二(符号类型改变文件权限)

还有一个改变权限的方法,从之前的介绍中我们可以发现,基本上就九个权限分别是:

  • user
  • group
  • others

那么我们就可以使用 u, g, o 来代表三种身份的权限!

此外, a 则代表 all,即全部的身份。读写的权限可以写成 r, w, x,也就是可以使用下表的方式来看:

chmod u
g
o
a
+ (加入)
- (除去)
= (设定)
r
w
x
文件或目录
  • 如果我们需要将文件权限设置为 -rwxr-xr-- ,可以使用 chmod u=rwx,g=rx,o=r 文件名 来设定。
  • 如果我们需要将文件权限设置为 -rw-r-x--- ,可以使用 chmod u=rw,g=r 文件名 来设定。

1.3 Linux 文件与目录管理

  • 绝对路径
    路径的写法,由根目录 / 写起,例如: /usr/share/doc 这个目录。

  • 相对路径
    路径的写法,不是由 / 写起,例如由 /usr/share/doc 要到 /usr/share/man 底下时,可以写成:cd ../man这就是相对路径的写法啦!

1)处理目录的常用命令

  1. ls: 列出目录

    ls -a:全部的文件,连同隐藏档( 开头为 . 的文件) 一起列出来(常用)
    ls -d:仅列出目录本身,而不是列出目录内的文件数据(常用)
    ls -l:长数据串列出,包含文件的属性与权限等等数据;(常用)
    ls -al:将目录下的所有文件列出来(含属性与隐藏档)
    ...(其它a/d/l组合使用情况)
    
  2. cd:切换目录

    cd [相对路径或绝对路径]
    
    cd /root/runoob/:使用绝对路径切换到 runoob 目录
    cd ./runoob/:使用相对路径切换到 runoob 目录
    cd ~:表示回到自己的根目录
    cd ..:表示去到目前的上一级目录,亦即是 /root 的上一级目录的意思;
    
  3. pwd:显示目前的目录

    pwd [-P]
    

    选项与参数:
    -P :显示出确实的路径,而非使用连结 (link) 路径。

  4. mkdir:创建一个新的目录

    mkdir [-mp] 目录名称
    

    选项与参数:
    -m :配置文件的权限喔!直接配置,不需要看默认权限 (umask) 的脸色~(如需要创建权限为 rwx--x--x 的目录:mkdir -m 711 test2
    -p :帮助你直接将所需要的目录(包含上一级目录)递归创建起来!(加了这个 -p 的选项,可以自行帮你创建多层目录:mkdir -p test1/test2/test3/test4

  5. rmdir:删除一个空的目录(不过要注意的是,这个 rmdir 仅能删除空的目录,你可以使用 rm 命令来删除非空目录)

    rmdir [-p] 目录名称
    
    举例:
    rmdir test <==可直接删除掉,没问题
    rmdir test1 <==因为尚有内容,所以无法删除!
    Directory not empty
    rmdir -p test1/test2/test3/test4(利用 -p 这个选项,立刻就可以将 test1/test2/test3/test4 一次删除)
    ls -l <==底下的输出中test与test1不见了!
    

    选项与参数:
    -p :连同上一级『空的』目录也一起删除

  6. cp: 复制文件或目录

    cp [-adfilprsu] 来源档(source) 目标档(destination) 
    cp [options] source1 source2 source3 .... directory
    

    选项与参数:
    -a:相当於 -pdr 的意思,至於 pdr 请参考下列说明;(常用)
    -d:若来源档为连结档的属性(link file),则复制连结档属性而非文件本身;
    -f:为强制(force)的意思,若目标文件已经存在且无法开启,则移除后再尝试一次;
    -i:若目标档(destination)已经存在时,在覆盖时会先询问动作的进行(常用)
    -l:进行硬式连结(hard link)的连结档创建,而非复制文件本身;
    -p:连同文件的属性一起复制过去,而非使用默认属性(备份常用);
    -r:递归持续复制,用於目录的复制行为;(常用)
    -s:复制成为符号连结档 (symbolic link),亦即『捷径』文件;
    -u:若 destination 比 source 旧才升级 destination !

    cp ~/.bashrc /tmp/bashrc
    cp -i ~/.bashrc /tmp/bashrc
    cp: overwrite `/tmp/bashrc'? n  <==n不覆盖,y为覆盖
    
  7. rm: 移除文件或目录

    rm [-fir] # 文件或目录
    

    选项与参数:
    -f :就是 force 的意思,忽略不存在的文件,不会出现警告信息;
    -i :互动模式,在删除前会询问使用者是否动作
    -r :递归删除啊!最常用在目录的删除了!这是非常危险的选项!!!

    # 将刚刚在 cp 的实例中创建的 bashrc 删除掉!
    rm -i bashrc
    rm: remove regular file `bashrc'? y
    
    rm -rf xxx # 删除文件夹
    

    如果加上 -i 的选项就会主动询问喔,避免你删除到错误的档名!

  8. mv (移动文件与目录,或修改名称)

    mv [-fiu] source destination
    mv [options] source1 source2 source3 .... directory
    

    选项与参数:
    -f :force 强制的意思,如果目标文件已经存在,不会询问而直接覆盖;
    -i :若目标文件 (destination) 已经存在时,就会询问是否覆盖!
    -u :若目标文件已经存在,且 source 比较新,才会升级 (update)

    复制一文件,创建一目录,将文件移动到目录中
    cd /tmp
    cp ~/.bashrc bashrc
    mkdir mvtest
    mv bashrc mvtest
    
    将刚刚的目录名称更名为 mvtest2
    mv mvtest mvtest2
    

1.4 Linux 解压和压缩文件

tar

tar解压命令如下所示。

-c: 建立压缩档案
-x:解压
-t:查看内容
-r:向压缩归档文件末尾追加文件
-u:更新原压缩包中的文件

这五个是独立的命令,压缩解压都要用到其中一个,可以和别的命令连用但只能用其中一个。

下面的参数是根据需要在压缩或解压档案时可选的。

-z:有gzip属性的
-j:有bz2属性的
-Z:有compress属性的
-v:显示所有过程
-O:将文件解开到标准输出

下面的参数-f是必须的。

-f: 使用档案名字,切记,这个参数是最后一个参数,后面只能接档案名

举例说明:

# 这条命令是将所有.jpg的文件打成一个名为all.tar的包。-c是表示产生新的包,-f指定包的文件名:
tar -cf all.tar *.jpg

# 这条命令是将所有.gif的文件增加到all.tar的包里面去。-r是表示增加文件的意思。
tar -rf all.tar *.gif

# 这条命令是更新原来tar包all.tar中logo.gif文件,-u是表示更新文件的意思。
tar -uf all.tar logo.gif

# 这条命令是列出all.tar包中所有文件,-t是列出文件的意思
tar -tf all.tar

# 这条命令是解出all.tar包中所有文件,-x是解开的意思
tar -xf all.tar

压缩举例:

# 将目录里所有jpg文件打包成tar.jpg
tar –cvf jpg.tar *.jpg

# 将目录里所有jpg文件打包成jpg.tar后,并且将其用gzip压缩,生成一个gzip压缩过的包,命名为jpg.tar.gz
tar –czf jpg.tar.gz *.jpg

# 将目录里所有jpg文件打包成jpg.tar后,并且将其用bzip2压缩,生成一个bzip2压缩过的包,命名为jpg.tar.bz2
tar –cjf jpg.tar.bz2 *.jpg

# 将目录里所有jpg文件打包成jpg.tar后,并且将其用compress压缩,生成一个umcompress压缩过的包,命名为jpg.tar.Z
tar –cZf jpg.tar.Z *.jpg

# rar格式的压缩,需要先下载rar for linux
rar a jpg.rar *.jpg

# zip格式的压缩,需要先下载zip for linux
zip jpg.zip *.jpg

解压举例:

# 解压 tar包
tar –xvf file.tar

# 解压tar.gz
tar -xzvf file.tar.gz

# 解压 tar.bz2
tar -xjvf file.tar.bz2

# 解压tar.Z
tar –xZvf file.tar.Z

# 解压rar
unrar e file.rar

# 解压zip
unzip file.zip

总结(解压文件)

*.tar (tar –xvf xxxFile.tar)
*.gz (gzip -d xxxFile.gz / gunzip xxxFile.gz)
*.tar.gz和*.tgz (tar –xzf xxxFile.tar.gz / tar –xzf xxxFile.tgz)
*.bz2 (bzip2 -d xxxFile.bz2 / bunzip2 xxxFile.bz2)
*.tar.bz2 (tar –xjf xxxFile.tar.bz2)
*.Z (uncompress xxxFile.Z)
*.tar.Z (tar –xZf xxxFile.tar.Z)
*.rar (unrar e xxxFile.rar)
*.zip (unzip xxxFile.zip)

1.5 Linux 文件内容查看

Linux系统中使用以下命令来查看文件的内容:

  1. cat 由第一行开始显示文件内容

    cat [-AbEnTv] 文件
    

    选项与参数:
    -A :相当於 -vET 的整合选项,可列出一些特殊字符而不是空白而已;
    -b :列出行号,仅针对非空白行做行号显示,空白行不标行号!
    -E :将结尾的断行字节 $ 显示出来;
    -n :列印出行号,连同空白行也会有行号,与 -b 的选项不同;
    -T :将 [tab] 按键以 ^I 显示出来;
    -v :列出一些看不出来的特殊字符

  2. tac 从最后一行开始显示,可以看出 tac 是 cat 的倒著写!

  3. nl 显示的时候,顺道输出行号!

    nl [-bnw] 文件
    
  4. more 一页一页的显示文件内容

    在 more 这个程序的运行过程中,你有几个按键可以按的:
    空白键 (space):代表向下翻一页;
    Enter :代表向下翻『一行』;
    /字串 :代表在这个显示的内容当中,向下搜寻『字串』这个关键字;
    :f :立刻显示出档名以及目前显示的行数;
    q :代表立刻离开 more ,不再显示该文件内容。
    b 或 [ctrl]-b :代表往回翻页,不过这动作只对文件有用,对管线无用。

  5. less 与 more 类似,但是比 more 更好的是,他可以往前翻页!

    less运行时可以输入的命令有:
    空白键 :向下翻动一页;
    [pagedown]:向下翻动一页;
    [pageup] :向上翻动一页;
    /字串 :向下搜寻『字串』的功能;
    ?字串 :向上搜寻『字串』的功能;
    n :重复前一个搜寻 (与 / 或 ? 有关!)
    N :反向的重复前一个搜寻 (与 / 或 ? 有关!)
    q :离开 less 这个程序;

  6. vi / vim 查看

  7. head 只看头几行

    head [-n number] 文件 
    

    选项与参数:
    -n :后面接数字,代表显示几行的意思

    默认的情况中,显示前面 10 行!
    head /etc/man.config
    若要显示前 20 行,就得要这样:
    head -n 20 /etc/man.config
    
  8. tail 只看尾巴几行

    tail [-n number] 文件 
    

    选项与参数:
    -n :后面接数字,代表显示几行的意思
    -f :表示持续侦测后面所接的档名,要等到按下[ctrl]-c才会结束tail的侦测

    默认的情况中,显示最后的10行!
    tail /etc/man.config
    若要显示最后的 20 行,就得要这样:
    tail -n 20 /etc/man.config
    
    默认的情况中,显示最后的10行!
    tail -f /etc/man.config
    若要显示最后的 100 行,就得要这样:
    tail -100f /etc/man.config
    
  9. 你可以使用 man [命令]来查看各个命令的使用文档,如:man cp。

1.6 Linux 用户和用户组管理

1.7 Linux 磁盘管理(df、du和fdisk)

  1. df:列出文件系统的整体磁盘使用量(df命令参数功能:检查文件系统的磁盘空间占用情况。可以利用该命令来获取硬盘被占用了多少空间,目前还剩下多少空间等信息)。

    df [-ahikHTm] [目录或文件名]
    

    在 Linux 底下如果 df 没有加任何选项,那么默认会将系统内所有的 (不含特殊内存内的文件系统与 swap) 都以 1 Kbytes 的容量来列出来!
    选项与参数:
    -a :列出所有的文件系统,包括系统特有的 /proc 等文件系统;
    -k :以 KBytes 的容量显示各文件系统;
    -m :以 MBytes 的容量显示各文件系统;
    -h :以人们较易阅读的 GBytes, MBytes, KBytes 等格式自行显示;
    -H :以 M=1000K 取代 M=1024K 的进位方式;
    -T :显示文件系统类型, 连同该 partition 的 filesystem 名称 (例如 ext3) 也列出;
    -i :不用硬盘容量,而以 inode 的数量来显示

  2. du:检查磁盘空间使用量(Linux du命令也是查看使用空间的,但是与df命令不同的是Linux du命令是对文件和目录磁盘使用的空间的查看)。

    du [-ahskm] 文件或目录名称
    

    直接输入 du 没有加任何选项时,则 du 会分析当前所在目录的文件与目录所占用的硬盘空间。
    选项与参数:
    -a :列出所有的文件与目录容量,因为默认仅统计目录底下的文件量而已。
    -h :以人们较易读的容量格式 (G/M) 显示;
    -s :列出总量而已,而不列出每个各别的目录占用容量;
    -S :不包括子目录下的总计,与 -s 有点差别。
    -k :以 KBytes 列出容量显示;
    -m :以 MBytes 列出容量显示;

  3. fdisk:用于磁盘分区

    fdisk [-l] 装置名称
    

    选项与参数:
    -l :输出后面接的装置所有的分区内容。若仅有 fdisk -l 时, 则系统将会把整个系统内能够搜寻到的装置的分区均列出来。

  4. 磁盘格式化(磁盘分割完毕后自然就是要进行文件系统的格式化,格式化的命令非常的简单,使用

    mkfs
    

    (make filesystem) 命令)

    mkfs [-t 文件系统格式] 装置文件名
    

    选项与参数:
    -t :可以接文件系统格式,例如 ext3, ext2, vfat 等(系统有支持才会生效)

    查看 mkfs 支持的文件格式
    mkfs[tab][tab]
    mkfs         mkfs.cramfs  mkfs.ext2    mkfs.ext3    mkfs.msdos   mkfs.vfat
    
  5. 磁盘检验(fsck(file system check)用来检查和维护不一致的文件系统。若系统掉电或磁盘发生问题,可利用fsck命令对文件系统进行检查)

    fsck [-t 文件系统] [-ACay] 装置名称
    

    选项与参数:
    -t : 给定档案系统的型式,若在 /etc/fstab 中已有定义或 kernel 本身已支援的则不需加上此参数
    -s : 依序一个一个地执行 fsck 的指令来检查
    -A : 对/etc/fstab 中所有列出来的 分区(partition)做检查
    -C : 显示完整的检查进度
    -d : 打印出 e2fsck 的 debug 结果
    -p : 同时有 -A 条件时,同时有多个 fsck 的检查一起执行
    -R : 同时有 -A 条件时,省略 / 不检查
    -V : 详细显示模式
    -a : 如果检查有错则自动修复
    -r : 如果检查有错则由使用者回答是否修复
    -y : 选项指定检测每个文件是自动输入yes,在不确定那些是不正常的时候,可以执行 # fsck -y 全部检查修复。

    查看系统有多少文件系统支持的 fsck 命令:
    fsck[tab][tab]
    fsck         fsck.cramfs  fsck.ext2    fsck.ext3    fsck.msdos   fsck.vfat
    
  6. 磁盘挂载与卸除(Linux 的磁盘挂载使用mount命令,卸载使用umount命令

    磁盘挂载mount [-t 文件系统] [-L Label名] [-o 额外选项] [-n]  装置文件名  挂载点
    
    用默认的方式,将刚刚创建的 /dev/hdc6 挂载到 /mnt/hdc6 上面!
    mkdir /mnt/hdc6
    mount /dev/hdc6 /mnt/hdc6
    df
    Filesystem           1K-blocks      Used Available Use% Mounted on
    .....中间省略.....
    /dev/hdc6              1976312     42072   1833836   3% /mnt/hdc6
    

    磁盘卸载命令 umount 语法:

    umount [-fn] 装置文件名或挂载点
    
    卸载/dev/hdc6
    umount /dev/hdc6
    

    选项与参数:
    -f :强制卸除!可用在类似网络文件系统 (NFS) 无法读取到的情况下;
    -n :不升级 /etc/mtab 情况下卸除。

1.8 Linux vi/vim

所有的 Unix Like 系统都会内建 vi 文书编辑器,其他的文书编辑器则不一定会存在。

但是目前我们使用比较多的是 vim 编辑器。vim 具有程序编辑的能力,可以主动的以字体颜色辨别语法的正确性,方便程序设计。(Vim是从 vi 发展出来的一个文本编辑器。代码补完、编译及错误跳转等方便编程的功能特别丰富,在程序员中被广泛使用)

1)vi/vim 的使用

基本上 vi/vim 共分为三种模式,分别是命令模式(Command mode)输入模式(Insert mode)底线命令模式(Last line mode)

  • 命令模式:

    用户刚刚启动 vi/vim,便进入了命令模式。
    此状态下敲击键盘动作会被Vim识别为命令,而非输入字符。比如我们此时按下i,并不会输入一个字符,i被当作了一个命令。
    以下是常用的几个命令:
    i 切换到输入模式,以输入字符。
    x 删除当前光标所在处的字符。
    : 切换到底线命令模式,以在最底一行输入命令。
    若想要编辑文本:启动Vim,进入了命令模式,按下i,切换到输入模式。
    命令模式只有一些最基本的命令,因此仍要依靠底线命令模式输入更多命令。

  • 输入模式在命令模式下按下 i 就进入了输入模式。
    在输入模式中,可以使用以下按键:
      字符按键以及Shift组合,输入字符
      ENTER,回车键,换行
      BACK SPACE,退格键,删除光标前一个字符
      DEL,删除键,删除光标后一个字符
      方向键,在文本中移动光标
      HOME/END,移动光标到行首/行尾
      Page Up/Page Down,上/下翻页
      Insert,切换光标为输入/替换模式,光标将变成竖线/下划线
      ESC,退出输入模式,切换到命令模式

  • 底线命令模式

    在命令模式下按下:(英文冒号)就进入了底线命令模式。
    底线命令模式可以输入单个或多个字符的命令,可用的命令非常多。
    在底线命令模式中,基本的命令有(已经省略了冒号):
      q 退出程序
      w 保存文件
      按ESC键可随时退出底线命令模式。

2)vi/vim 按键说明

  除了上面简易范例的 i, Esc, :wq 之外,其实 vim 还有非常多的按键可以使用。

第一部份:一般模式可用的光标移动、复制粘贴、搜索替换等

移动光标的方法
h 或 向左箭头键(←) 光标向左移动一个字符
j 或 向下箭头键(↓) 光标向下移动一个字符
k 或 向上箭头键(↑) 光标向上移动一个字符
l 或 向右箭头键(→) 光标向右移动一个字符
如果你将右手放在键盘上的话,你会发现 hjkl 是排列在一起的,因此可以使用这四个按钮来移动光标。 如果想要进行多次移动的话,例如向下移动 30 行,可以使用 "30j" 或 "30↓" 的组合按键, 亦即加上想要进行的次数(数字)后,按下动作即可!
[Ctrl] + [f] 屏幕『向下』移动一页,相当于 [Page Down]按键 (常用)
[Ctrl] + [b] 屏幕『向上』移动一页,相当于 [Page Up] 按键 (常用)
[Ctrl] + [d] 屏幕『向下』移动半页
[Ctrl] + [u] 屏幕『向上』移动半页
+ 光标移动到非空格符的下一行
- 光标移动到非空格符的上一行
n 那个 n 表示『数字』,例如 20 。按下数字后再按空格键,光标会向右移动这一行的 n 个字符。例如 20 则光标会向后面移动 20 个字符距离。
0 或功能键[Home] 这是数字『 0 』:移动到这一行的最前面字符处 (常用)
$ 或功能键[End] 移动到这一行的最后面字符处(常用)
H 光标移动到这个屏幕的最上方那一行的第一个字符
M 光标移动到这个屏幕的中央那一行的第一个字符
L 光标移动到这个屏幕的最下方那一行的第一个字符
G 移动到这个档案的最后一行(常用)
nG n 为数字。移动到这个档案的第 n 行。例如 20G 则会移动到这个档案的第 20 行(可配合 :set nu)
gg 移动到这个档案的第一行,相当于 1G 啊! (常用)
n n 为数字。光标向下移动 n 行(常用)
搜索替换
/word 向光标之下寻找一个名称为 word 的字符串。例如要在档案内搜寻 vbird 这个字符串,就输入 /vbird 即可! (常用)
?word 向光标之上寻找一个字符串名称为 word 的字符串。
n 这个 n 是英文按键。代表重复前一个搜寻的动作。举例来说, 如果刚刚我们执行 /vbird 去向下搜寻 vbird 这个字符串,则按下 n 后,会向下继续搜寻下一个名称为 vbird 的字符串。如果是执行 ?vbird 的话,那么按下 n 则会向上继续搜寻名称为 vbird 的字符串!
N 这个 N 是英文按键。与 n 刚好相反,为『反向』进行前一个搜寻动作。 例如 /vbird 后,按下 N 则表示『向上』搜寻 vbird 。
使用 /word 配合 n 及 N 是非常有帮助的!可以让你重复的找到一些你搜寻的关键词!
:n1,n2s/word1/word2/g n1 与 n2 为数字。在第 n1 与 n2 行之间寻找 word1 这个字符串,并将该字符串取代为 word2 !举例来说,在 100 到 200 行之间搜寻 vbird 并取代为 VBIRD 则: 『:100,200s/vbird/VBIRD/g』。(常用)
:1,$s/word1/word2/g 或 :%s/word1/word2/g 从第一行到最后一行寻找 word1 字符串,并将该字符串取代为 word2 !(常用)
:1,$s/word1/word2/gc 或 :%s/word1/word2/gc 从第一行到最后一行寻找 word1 字符串,并将该字符串取代为 word2 !且在取代前显示提示字符给用户确认 (confirm) 是否需要取代!(常用)
删除、复制与贴上
x, X 在一行字当中,x 为向后删除一个字符 (相当于 [del] 按键), X 为向前删除一个字符(相当于 [backspace] 亦即是退格键) (常用)
nx n 为数字,连续向后删除 n 个字符。举例来说,我要连续删除 10 个字符, 『10x』。
dd 删除游标所在的那一整行(常用)
ndd n 为数字。删除光标所在的向下 n 行,例如 20dd 则是删除 20 行 (常用)
d1G 删除光标所在到第一行的所有数据
dG 删除光标所在到最后一行的所有数据
d$ 删除游标所在处,到该行的最后一个字符
d0 那个是数字的 0 ,删除游标所在处,到该行的最前面一个字符
yy 复制游标所在的那一行(常用)
nyy n 为数字。复制光标所在的向下 n 行,例如 20yy 则是复制 20 行(常用)
y1G 复制游标所在行到第一行的所有数据
yG 复制游标所在行到最后一行的所有数据
y0 复制光标所在的那个字符到该行行首的所有数据
y$ 复制光标所在的那个字符到该行行尾的所有数据
p, P p 为将已复制的数据在光标下一行贴上,P 则为贴在游标上一行! 举例来说,我目前光标在第 20 行,且已经复制了 10 行数据。则按下 p 后, 那 10 行数据会贴在原本的 20 行之后,亦即由 21 行开始贴。但如果是按下 P 呢? 那么原本的第 20 行会被推到变成 30 行。 (常用)
J 将光标所在行与下一行的数据结合成同一行
c 重复删除多个数据,例如向下删除 10 行,[ 10cj ]
u 复原前一个动作。(常用)
[Ctrl]+r 重做上一个动作。(常用)
这个 u 与 [Ctrl]+r 是很常用的指令!一个是复原,另一个则是重做一次~ 利用这两个功能按键,你的编辑,嘿嘿!很快乐的啦!
. 不要怀疑!这就是小数点!意思是重复前一个动作的意思。 如果你想要重复删除、重复贴上等等动作,按下小数点『.』就好了! (常用)

第二部份:一般模式切换到编辑模式的可用的按钮说明

进入输入或取代的编辑模式
i, I 进入输入模式(Insert mode): i 为『从目前光标所在处输入』, I 为『在目前所在行的第一个非空格符处开始输入』。 (常用)
a, A 进入输入模式(Insert mode): a 为『从目前光标所在的下一个字符处开始输入』, A 为『从光标所在行的最后一个字符处开始输入』。(常用)
o, O 进入输入模式(Insert mode): 这是英文字母 o 的大小写。o 为『在目前光标所在的下一行处输入新的一行』; O 为在目前光标所在处的上一行输入新的一行!(常用)
r, R 进入取代模式(Replace mode): r 只会取代光标所在的那一个字符一次;R会一直取代光标所在的文字,直到按下 ESC 为止;(常用)
上面这些按键中,在 vi 画面的左下角处会出现『--INSERT--』或『--REPLACE--』的字样。 由名称就知道该动作了吧!!特别注意的是,我们上面也提过了,你想要在档案里面输入字符时, 一定要在左下角处看到 INSERT 或 REPLACE 才能输入喔!
[Esc] 退出编辑模式,回到一般模式中(常用)

第三部份:一般模式切换到指令行模式的可用的按钮说明

指令行的储存、离开等指令
:w 将编辑的数据写入硬盘档案中(常用)
:w! 若文件属性为『只读』时,强制写入该档案。不过,到底能不能写入, 还是跟你对该档案的档案权限有关啊!
:q 离开 vi (常用)
:q! 若曾修改过档案,又不想储存,使用 ! 为强制离开不储存档案。
注意一下啊,那个惊叹号 (!) 在 vi 当中,常常具有『强制』的意思~
:wq 储存后离开,若为 :wq! 则为强制储存后离开 (常用)
ZZ 这是大写的 Z 喔!若档案没有更动,则不储存离开,若档案已经被更动过,则储存后离开!
:w [filename] 将编辑的数据储存成另一个档案(类似另存新档)
:r [filename] 在编辑的数据中,读入另一个档案的数据。亦即将 『filename』 这个档案内容加到游标所在行后面
:n1,n2 w [filename] 将 n1 到 n2 的内容储存成 filename 这个档案。
:! command 暂时离开 vi 到指令行模式下执行 command 的显示结果!例如 『:! ls /home』即可在 vi 当中察看 /home 底下以 ls 输出的档案信息!
vim 环境的变更
:set nu 显示行号,设定之后,会在每一行的前缀显示该行的行号
:set nonu 与 set nu 相反,为取消行号!

特别注意,在 vi/vim 中,数字是很有意义的!数字通常代表重复做几次的意思! 也有可能是代表去到第几个什么什么的意思。

举例来说,要删除 50 行,则是用 『50dd』 对吧! 数字加在动作之前,如我要向下移动 20 行呢?那就是『20j』或者是『20↓』即可。

2、Shell 教程

Shell 编程跟 java、php 编程一样,只要有一个能编写代码的文本编辑器和一个能解释执行的脚本解释器就可以了。

Linux 的 Shell 种类众多,常见的有:

  • Bourne Shell(/usr/bin/sh或/bin/sh)
  • Bourne Again Shell(/bin/bash)
  • C Shell(/usr/bin/csh)
  • K Shell(/usr/bin/ksh)
  • Shell for Root(/sbin/sh)
  • ……  

Windows 环境下测试 Shell 脚本(Windows 搜索 bash):git bash

2.1 第一个shell脚本

  1. 保存一个 .sh 文件:test.sh,可以使用 vim 命令新建一个文本
  2. 插入(i)语句:echo "Hello, world",保存为test.sh文本
  3. 并使用 chmod 命令:chromd -R 744 test.sh,使得 test.sh 文件具有执行权限
  4. 执行 test.sh 文件:./test.sh

2.2 Shell 变量

  1. 使用变量

    your_name="qinjx"
    echo $your_name
    echo ${your_name}
    

    变量名外面的花括号是可选的,加不加都行,加花括号是为了帮助解释器识别变量的边界,比如下面这种情况:

    for skill in Ada Coffe Action Java; do
        echo "I am good at ${skill}Script"
    done
    

    如果不给skill变量加花括号,写成echo "I am good at $skillScript",解释器就会把$skillScript当成一个变量(其值为空),代码执行结果就不是我们期望的样子了。

    推荐给所有变量加上花括号,这是个好的编程习惯。已定义的变量,可以被重新定义,如:

    your_name="tom"
    echo $your_name
    your_name="alibaba"
    echo $your_name
    

    这样写是合法的,但注意,第二次赋值的时候不能写$your_name="alibaba",使用变量的时候才加美元符($)。

  2. 只读变量

    使用 readonly 命令可以将变量定义为只读变量,只读变量的值不能被改变。

    下面的例子尝试更改只读变量,结果报错:
    #!/bin/bash
    myUrl="http://www.google.com"
    readonly myUrl
    myUrl="http://www.runoob.com"
    
    运行脚本,结果如下:
    /bin/sh: NAME: This variable is read only.
    
  3. 删除变量

    使用 unset 命令可以删除变量。变量被删除后不能再次使用。unset 命令不能删除只读变量。

    unset variable_name
    
    #!/bin/sh
    myUrl="http://www.runoob.com"
    unset myUrl
    echo $myUrl
    
  4. 变量类型
    运行shell时,会同时存在三种变量:

    1. 局部变量 局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量。
    2. 环境变量 所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行。必要的时候shell脚本也可以定义环境变量。
    3. shell变量 shell变量是由shell程序设置的特殊变量。shell变量中有一部分是环境变量,有一部分是局部变量,这些变量保证了shell的正常运行

2.3 Shell 数组

bash支持一维数组(不支持多维数组),并且没有限定数组的大小。

类似于 C 语言,数组元素的下标由 0 开始编号。获取数组中的元素要利用下标,下标可以是整数或算术表达式,其值应大于或等于 0。

  1. 定义数组

    # 在 Shell 中,用括号来表示数组,数组元素用"空格"符号分割开。定义数组的一般形式为:
    
    数组名=(值1 值2 ... 值n)
    # 例如:
    array_name=(value0 value1 value2 value3)
    # 或者
    array_name=(
    value0
    value1
    value2
    value3
    )
    # 还可以单独定义数组的各个分量:
    array_name[0]=value0
    array_name[1]=value1
    array_name[n]=valuen
    
  2. 读取数组

    # 读取数组元素值的一般格式是:
    ${数组名[下标]}
    # 例如:
    valuen=${array_name[n]}
    # 使用 @ 符号可以获取数组中的所有元素,例如:
    echo ${array_name[@]}
    
  3. 获取数组的长度

    # 获取数组长度的方法与获取字符串长度的方法相同,例如:
    # 取得数组元素的个数
    length=${#array_name[@]}
    # 或者
    length=${#array_name[*]}
    # 取得数组单个元素的长度
    lengthn=${#array_name[n]}
    

2.3 Shell 传递参数

(1)修改 test.sh 内容为:

echo "Shell 传递参数实例!";
echo "执行的文件名:$0";
echo "第一个参数为:$1";
echo "第二个参数为:$2";
echo "第三个参数为:$3";

另外,还有几个特殊字符用来处理参数:

参数处理 说明
$# 传递到脚本的参数个数
$* 以一个单字符串显示所有向脚本传递的参数。
如"*"用「"」括起来的情况、以"$1 $2 … $n"的形式输出所有参数。
$$ 脚本运行的当前进程ID号
$! 后台运行的最后一个进程的ID号
$@ $*相同,但是使用时加引号,并在引号中返回每个参数。 如$@用「"」括起来的情况、以"$1" "$2" … "$n" 的形式输出所有参数。
$- 显示Shell使用的当前选项,与set命令功能相同。
$? 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。

(2)修改 test.sh 内容为:

$*$@ 区别:

  • 相同点:都是引用所有参数。
  • 不同点:只有在双引号中体现出来。假设在脚本运行时写了三个参数 1、2、3,,则 " * " 等价于 "1 2 3"(传递了一个参数),而 "@" 等价于 "1" "2" "3"(传递了三个参数)。

(3)修改 test.sh 内容为:

略。

posted on 2019-01-15 20:24  zyjhandsome  阅读(499)  评论(0)    收藏  举报