[随笔][Shell][读书笔记][Linux命令行与shell脚本编程][第三章 基本的bash shell命令]

3.1 启动shell

  • GUN bash shell可以提供对Linux系统的交互式访问,可以作为普通的程序运行。登陆时系统启动的shell依赖于用户账户的配置
  • /etc/passwd文件包含了所有系统用户账户列表以及每个用户的基本配置信息。下面是一个/etc/passwd的例子
[root@localhost ~]# cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
polkitd:x:999:998:User for polkitd:/:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
chrony:x:998:996::/var/lib/chrony:/sbin/nologin
liu:x:1000:1000:liu:/home/liu:/bin/bash
[root@localhost ~]# 
  • 每个条目分为7个字段,字段之间使用冒号分隔,不存在的字段也要使用冒号进行分隔。最后一个字段指定了用户使用的shell程序

3.2 shell提示符

  • shell的默认提示符是$,该符号表示正在等待用户输入。root用户的提示符是#。

3.3 bash手册

  • 大对数的LInux发行版本自带用以查找shell命令以及其他GUN工具信息的在线手册。
  • man命令用来访问存储在Linux系统上面的手册页面。man ls的显示信息
LS(1)                            User Commands                           LS(1)

NAME
       ls - list directory contents

SYNOPSIS
       ls [OPTION]... [FILE]...

DESCRIPTION
       List  information  about  the FILEs (the current directory by default).
       Sort entries alphabetically if none of -cftuvSUX nor --sort  is  speci‐
       fied.

       Mandatory  arguments  to  long  options are mandatory for short options
       too.

       -a, --all
              do not ignore entries starting with .

       -A, --almost-all
              do not list implied . and ..

 Manual page ls(1) line 1 (press h for help or q to quit)
  • 在使用man命令查看命令手册的时候,这些手册是由分页程序进行显示的。分页程序是一种实用工具,能够逐行显示文本。空格翻页,回车逐行显示,q退出。
  • 手册将命令的信息分为不同的节,一份标准的节有Name, Synopsis, Configuration, Description, Options, Exit Status, Return Value, Errors, Environment, Files, Versions, Conforming To, Notes, Bugs, Example, Authors, Copyright, See Also。
  • 使用-k选项可以搜索Name部分的简短描述。man -k print
  • 手册对内容区域都分配了一个数字,1-9,表示该命令来自不同的区域,通常显示最低的内容区域。
1    可执行程序或shell命令
2    系统调用
3    库调用
4    特殊文件
5    文件格式与约定
6    游戏
7    概览约定及杂项
8    超级用户和系统管理员命令
9    内核例程
  • man工具通常提供的是命令所对应的内容的最低编号的内容。一个命令可能会在多个区域都有对应的内容。如果想查看不同的内容区域的手册页面,可以添加section, man section# topic。man 8 chmod

3.4 浏览文件系统

  • 当登陆到shell后,一般处于自己的主目录中。
  • Linux文件系统中不使用驱动器盘符,Windows为每个物理磁盘驱动器分配一个盘符,每个驱动器都会有自己的目录结构。Linux将文件存储在单个目录结构中,这个目录被称为“虚拟目录(virtual directory)”,虚拟目录将安装在PC上的所有存储设备的文件路径纳入单个目录结构中。Linux的虚拟目录结构只包含一个root目录的基础目录,根目录下的目录和文件会按照访问他们的目录路径一一列出,这点跟Windows类似。
  • 在Linux中,使用/对目录进行区隔,使用\用来标识转义字符。文件的路径本身并没有提供任何有关文件存储在哪个磁盘上的信息。
  • 在Linux PC中安装的第一块硬盘称为根驱动器,根驱动器包含了虚拟目录的核心,其他目录都是从那里开始创建的。Linux会在根驱动器上创建一些特别的目录,称为挂载点(mount point),挂载点是虚拟目录中用于分配额外存储设备的目录。虚拟目录会让文件和目录出现在这些挂载点目录中,然而实际上他们却存储在另外一个驱动器中。通常系统文件会存储在根驱动器中,用户文件存储在另一个驱动器中。
  • 常见的目录名遵循了FHS。
  • 登陆系统之后,会话从主目录开始,主目录是分配给用户账户的一个特有目录,用户账户在创建之后,一般会在/home目录下创建一个和用户账户同名的目录。
  • 使用cd命令将shell会话切换到另一个目录,如果没有指定目标路径,将切换到用户主目录。destination可以使用绝对路径,也可以使用相对路径。
cd destination
  • 在相对路径中,.表示的是当前目录,..表示的是当前目录的父目录。

3.5 文件和目录列表

  • ls命令最基本的形式是显示当前目录下的文件和目录,输出是按照字母排序的(按列排序)。使用-F参数的ls命令轻松区分文件和目录,在目录后面添加了/用来表示这些是目录,在可执行文件后面添加型号
[root@localhost sysconfig]# ls -F
anaconda    crond             iptables-config  netconsole        run-parts
authconfig  ebtables-config   irqbalance       network           selinux@
cbq/        firewalld         kdump            network-scripts/  sshd
chronyd     grub@             kernel           rdisc             wpa_supplicant
console/    init              man-db           readonly-root
cpupower    ip6tables-config  modules/         rsyslog
[root@localhost sysconfig]# ^C

nf-ct-add*                           zfgrep*
nf-ct-list*                          zforce*
nf-exp-add*                          zgrep*
nf-exp-delete*                       zless*
nf-exp-list*                         zmore*
nf-log*                              znew*
nf-monitor*                          zsoelim@
nf-queue*
[root@localhost bin]# 
  • 基本的ls命令不会显示隐藏文件,Linux一般采用隐藏文件保存配置信息。隐藏文件的文件名以点开始。添加-a参数使得ls显示隐藏文件。
[root@localhost ~]# ls -a
.   anaconda-ks.cfg  .bash_logout   .bashrc  .tcshrc
..  .bash_history    .bash_profile  .cshrc
[root@localhost ~]# 
  • 三个以.bash开始的文件是bash shell 环境使用的隐藏文件。
  • -R参数叫做递归选项。列出了当前目录下包含的子目录中的文件。一直递归到当前目录没有子目录的情况。
[root@localhost sysconfig]# ls -R
.:
anaconda    crond             iptables-config  netconsole       run-parts
authconfig  ebtables-config   irqbalance       network          selinux
cbq         firewalld         kdump            network-scripts  sshd
chronyd     grub              kernel           rdisc            wpa_supplicant
console     init              man-db           readonly-root
cpupower    ip6tables-config  modules          rsyslog

./cbq:
avpkt  cbq-0000.example

./console:

./modules:

./network-scripts:
ifcfg-enp0s3  ifdown-post      ifup-bnep   ifup-routes
ifcfg-enp0s8  ifdown-ppp       ifup-eth    ifup-sit
ifcfg-lo      ifdown-routes    ifup-ippp   ifup-Team
ifdown        ifdown-sit       ifup-ipv6   ifup-TeamPort
ifdown-bnep   ifdown-Team      ifup-isdn   ifup-tunnel
ifdown-eth    ifdown-TeamPort  ifup-plip   ifup-wireless
ifdown-ippp   ifdown-tunnel    ifup-plusb  init.ipv6-global
ifdown-ipv6   ifup             ifup-post   network-functions
ifdown-isdn   ifup-aliases     ifup-ppp    network-functions-ipv6
[root@localhost sysconfig]# 
  • 默认情况下,ls只输出文件或者目录的名字,要显示附加的信息,使用-l参数。use a long listing format。
drwxr-xr-x.  2 root root      187 Apr 13 08:58 yum.repos.d
文件类型    文件权限    硬链接数    文件所有者    文件所属的组    文件大小(字节为单位)    文件上次修改时间    文件名或者目录名
  • ls支持在命令行中定义过滤器,会通过过滤器决定哪些文件或目录应该输出在显示器上。
[root@localhost etc]# ls -l yum.conf 
-rw-r--r--. 1 root root 970 Apr 13 08:58 yum.conf
[root@localhost etc]# 
  • 当用户指定特定文件名称作为过滤器时,ls命令只会显示该文件的信息。同时ls还可以能够通过标准通配符,并在过滤器中使用提供的通配符进行模式匹配。

    ? 代表一个字符
    • 代表零个或多个字符
  • 在过滤器中使用型号和问号被称为文件扩展匹配(file globbing),也就是使用通配符进行模式匹配的过程。通配符正式的名称为元字符通配符(metacharacter wildcards)。除了星号和问号之外,中括号,中括号的短横线,感叹号都是元字符通配符。[ab], [a-x], [!a]
[root@localhost etc]# ls -l yum.*
-rw-r--r--. 1 root root 970 Apr 13 08:58 yum.conf

yum.repos.d:
total 32
-rw-r--r--. 1 root root 1664 Apr 28 12:35 CentOS-Base.repo
-rw-r--r--. 1 root root 1309 Apr 28 12:35 CentOS-CR.repo
-rw-r--r--. 1 root root  649 Apr 28 12:35 CentOS-Debuginfo.repo
-rw-r--r--. 1 root root  314 Apr 28 12:35 CentOS-fasttrack.repo
-rw-r--r--. 1 root root  630 Apr 28 12:35 CentOS-Media.repo
-rw-r--r--. 1 root root 1331 Apr 28 12:35 CentOS-Sources.repo
-rw-r--r--. 1 root root 4768 Apr 28 12:35 CentOS-Vault.repo
[root@localhost etc]# 

3.6 处理文件

  • 使用touch命令创建空文件。同时可以使用touch命令更改文件的修改时间。如果只想改变访问时间,使用-a参数。
[root@localhost ~]# ls -l hello.txt
-rw-r--r--. 1 root root 0 Oct 10 02:33 hello.txt
[root@localhost ~]# touch hello.txt
[root@localhost ~]# ls -l hello.txt
-rw-r--r--. 1 root root 0 Oct 10 02:35 hello.txt
[root@localhost ~]# touch -a hello.txt 
[root@localhost ~]# ls -l --time=atime hello.txt
-rw-r--r--. 1 root root 0 Oct 10 02:36 hello.txt
[root@localhost ~]# ls -l hello.txt
-rw-r--r--. 1 root root 0 Oct 10 02:35 hello.txt
[root@localhost ~]# 
  • 默认的ls -l不会显示访问时间,默认显示的时间时修改时间。添加参数--time=atime就可以显示访问时间。添加-d参数使得ls只会显示目录。

  • 使用cp命令进行文件或者目录的复制。基本用法中有两个参数cp source destination。当source和destination都是文件的时候,cp命令将源文件复制成一个新文件,并且以destination命名。修改时间会改变。
//目标位置为一个文件名
[root@localhost ~]# ls
anaconda-ks.cfg  hello.txt
[root@localhost ~]# cp hello.txt ab.txt
[root@localhost ~]# ls
ab.txt  anaconda-ks.cfg  hello.txt
[root@localhost ~]# 

// 如果输入的目标位置是一个目录,则将源文件复制到目标目录下,文件名不变。如果输入的目录不存在,则复制操作失败。使用```-R```参数可以递归的复制整个目录,正常情况下使用cp复制目录的时候会失败,需要使用```-R```进行递归复制。
// 在使用```cp```命令的时候使用点(.)表示复制到当前目录中。
[root@localhost ~]# cp /etc/sudoers .
[root@localhost ~]# ls
anaconda-ks.cfg  sudoers
[root@localhost ~]# 
  • 链接文件时Linux文件系统的一大优势。如果需要在系统上维护同一文件的两份或多个副本,除了保存多分单独的物理文件副本之外,还可以采用保持一份物理副本和多个虚拟副本的方式,这种虚拟的副本称为“链接”。
  • Linux中有两种链接:符号链接,硬链接。
  • 符号链接是一个实实在在的文件,指向存放在虚拟目录结构中的某个地方的另一个文件,这两个通过符号链接在一起的文件,彼此的内容并不相同
  • 要给一个文件创建符号链接,原始文件必须存在。可以使用ln -s创建符号链接。
[root@localhost ~]# ls -l data_file 
-rw-r--r--. 1 root root 427 Oct 10 19:03 data_file
[root@localhost ~]# ln -s data_file sl_data_file
[root@localhost ~]# ls -l *data_file
-rw-r--r--. 1 root root 427 Oct 10 19:03 data_file
lrwxrwxrwx. 1 root root   9 Oct 10 19:03 sl_data_file -> data_file
[root@localhost ~]# 
  • sl_data_file文件的大小是9个字节,而原始的data_file的大小是427个字节,sl_data_file仅仅只是指向data_file而已,他们的内容并不相同,是两个完全不同的文件。符号链接是一个实实在在的文件。
  • 同时可以通过查看inode号证明链接文件和原始文件是两个不同的文件。文件或者目录的inode编号是一个用于标识的唯一数字,这个数字由内核分配给文件系统中的每一个 对象。使用ls -i查看文件或者目录的inode编号。
[root@localhost ~]# ls -i data_file sl_data_file 
8409203 data_file  8409201 sl_data_file
[root@localhost ~]# 
  • 硬链接会创建独立的虚拟文件,其中包含了原始文件的信息及位置,他们从根本上是一个文件。引用硬链接等同于引用了源文件。要创建硬链接,原始文件必须存在。使用ln命令是不需要添加参数创建硬链接。
[root@localhost ~]# ls -l data_file 
-rw-r--r--. 1 root root 112 Oct 10 19:15 data_file
[root@localhost ~]# ls -i data_file 
8409202 data_file
[root@localhost ~]# ln data_file hl_data_file
[root@localhost ~]# ls -li *data_file
8409202 -rw-r--r--. 2 root root 112 Oct 10 19:15 data_file
8409202 -rw-r--r--. 2 root root 112 Oct 10 19:15 hl_data_file
[root@localhost ~]# 
  • 带有硬链接的文件共享inode号,本质上他们是同一个文件。-l选项中的第三列链接计数显示这两个文件都有两个链接。
  • 只能对处于同一存储媒体的文件创建硬链接,如果想在不同的存储介质中创建链接,只能创建符号链接
  • 不要创建软链接的软链接,容易断链。
  • 无论是对于软链接还是硬链接,使用cp命令复制都会得到源文件的一个副本。对于符号链接,虽然和源文件是不同的文件,有不同的inode号,但是使用cp复制的时候,得到的仍是源文件的一个副本。

  • mv命令可以将一个文件或者目录移动到另一个位置或重命名。移动或者重命名之后,文件的修改时间不变,但是访问时间更改。文件的inode号不变。mv只影响文件名。
[root@localhost ~]# ls -l data_file 
-rw-r--r--. 1 root root 112 Oct 10 19:15 data_file
[root@localhost ~]# mv data_file code_file
[root@localhost ~]# ls -l code_file 
-rw-r--r--. 1 root root 112 Oct 10 19:15 code_file
[root@localhost ~]# 
  • mv唯一改变的就是位置。可以使用mv移动整个目录及其内容。

  • 使用rm命令删除文件。bash shell中没有垃圾站或者回收站,一旦删除就无法找回。因此在使用rm命令是最好加上-i参数。使用rm命令的时候,文件名也可以使用通配符匹配。

3.7 处理目录

  • cp, mv等命令对文件和目录都有效,有些命令只对目录有效。
  • 使用mkdir创建目录。
  • 使用-p参数批量创建目录及其子目录。该参数可以根据需要创建确实的父目录。
  • 删除目录的基本命令是rmdir,默认情况下rmdir只删除空目录。只能删除空目录。可以在非空目录上使用rm -r递归删除目录下的文件,然后删除目录本身。
  • 使用-f参数删除而没有警告信息。

3.8 查看文件内容

  • Linux上有三个工具可以用来查看文本文件内容。
  • cat命令用于将文件内容输出到标准输出中,使用-n参数会被所有的行加上行号。使用-b参数只给有文本的行添加行号。使用-T参数不让制表符出现,使用"^T"代替所有的制表符。
  • more, less命令可以浏览文本。
  • 查看部分文件内容可以使用tail命令。会显示文件的最后几行的内容,默认情况显示文件的最后10行。使用-n参数更改显示的行数。-f参数是tail命令的一个突出特性,允许在其他进程使用该文件时查看文件的内容,tail命令此时会保持会话活动状态,并不断的显示添加到文件中的内容。可以用于实时监控系统日志。
  • head命令用于显示文件开头的那几行。默认情况会显示开头的10行,使用-n参数改变显示行的数目。可以是-n 7的形式,也可以是-7的形式。

猜你喜欢

转载自www.cnblogs.com/person3/p/9765620.html
今日推荐