Linux考试内容

发布时间:2024年01月05日

第一章 系统概述

发展历史与现状

1984年,Richard Stallman组织开发了一个完全基于自由软件的软件体系计划——GNU(GNU是GNU is Not UNIX的递归缩写),并且拟定了一份通用公共许可证(General Public License,简称GPL

在20世纪80年代时,Andrew S.Tanenbaum教授为了满足教学的需要,自行设计了一个微型UNIX操作系统——MINIX

1991年芬兰赫尔辛基大学的学生Linus Torvalds在自己的Intel 386个人计算机上开发了属于他自己的第一个程序,并利用Internet发布了他开发的源代码,将其命名为Linux,从而创建了Linux操作系统

Linux现状

目前,其主要应用领域是服务器系统嵌入式系统云计算系统

超级计算机和服务器领域

嵌入式系统

云计算系统

桌面系统

linux特点

与UNIX兼容

自由软件,源码公开

性能高,安全性强

便于定制和再开发

互操作性高

全面的多任务和真正的32位操作系统

linux存在的问题

没有特定的支持厂商,不像Windows系统有微软公司专门运营开发并进行版本更新;

使用不方便,命令行方式难学难记;

图形界面不如Windows7或Windows10等产品那样靓丽舒适;

应用软件少,特别是游戏软件不如Windows丰富多彩;等等

对比Windows

第二章 Linux安装

配置分区

选择安装分区及分区方式是安装Linux的关键步骤,因为如果操作失误将会有丢失硬盘数据的危险,所以应慎重选择。

Linux通过字母和数字的组合来标识硬盘分区。

前两个字母表示分区所在设备的类型,如hd表示IDE硬盘,sd表示SCSI/SATA/USB硬盘;

第三个字母表示分区在哪个设备上,如hda表示第一块IDE硬盘,hdb表示第二块IDE硬盘,sdc表示第三块SCSI硬盘;

最后的数字表示分区的次序,如数字1~4表示主分区或扩展分区,逻辑分区从5开始。如果没有对磁盘分区,则一律不加数字,表示整块磁盘。

开关机指令

  • 关机指令:poweroff shutdown -h now halt -p halt -d
  • 重启指令:reboot shutdown -r now

第三章 Linux图形化界面

常用桌面
Linux 操作系统支持多种桌面环境,每个桌面环境都有自己的特点、外观和用户体验。以下是一些常见的 Linux 桌面环境:

GNOME:

  • 特点: 现代、直观的用户界面,注重用户体验。默认桌面环境的一些发行版,如Ubuntu。
  • 代表性发行版: Ubuntu(默认桌面环境为 GNOME Shell)

KDE Plasma:

  • 特点: 功能丰富、可定制性强,提供直观的用户界面。使用 Qt 工具包构建。
  • 代表性发行版: Kubuntu(默认桌面环境为 KDE Plasma)

Xfce:

  • 特点: 轻量级、快速,适合较老的硬件或对系统资源有限制的用户。
  • 代表性发行版: Xubuntu(默认桌面环境为 Xfce)

LXQt:

  • 特点: 一个轻量级、模块化的桌面环境,是 LXDE(Lightweight X11 Desktop Environment)和 Razor-qt 项目的继任者。
  • 代表性发行版: Lubuntu(默认桌面环境为 LXQt)

Cinnamon:

  • 特点: 注重传统桌面环境的用户体验,提供直观的菜单和任务栏。
  • 代表性发行版: Linux Mint(Cinnamon 版本)

MATE:

  • 特点: 基于 GNOME 2 的一个分支,提供传统的桌面环境和用户体验。
  • 代表性发行版: Linux Mint(MATE 版本)

Pantheon:

  • 特点: 由 elementary OS 团队开发,注重简洁、美观的设计,类似于 macOS 的外观。
  • 代表性发行版: elementary OS

X Window系统

X客户是使用系统窗口功能的一些应用程序。

X服务器也称作显示管理器,是控制实际显示设备和输入设备的程序。

KDE中的快捷键

命令行加载U盘

  • 插上你的USB移动存储器

  • 进入终端命令行模式,用以下命令为外挂点新建一个子目录:mkdir /mnt/usb

  • 挂上你的USB移动存储

  • USB移动存储通常被识别为sda1,具体可通过fdisk -l命令查询。需要注意的是你的USB移动存储器文件系统,若是FAT16的,文件系统格式为msdos;若是FAT32的,则文件系统格式为vfat。查看完毕后执行以下命令即可

    mount -t msdos /dev/sda1 /mnt/usb 或者

    mount -t vfat /dev/sda1 /mnt/usb

第四章 常用命令及文件操作

进入与退出命令行

进入

  1. 如果在KDE桌面上有“终端程序”图标,那么用鼠标双击它
  2. 若是GNOME则需要Alt+F2之后输入gnome-terminal

退出

  1. 单击窗口右上角的“关闭”按钮
  2. 在shell提示符下输入exit
  3. 按快捷键Ctrl+D

命令提示符

例如:[zouran@localhost ~]$ 是shell主提示符 其中

“zouran”表示当前用户名

“localhost”是默认的主机名

“~”表示默认用户主目录

“$ ” 表示当前用户是普通用户

“# ”表示超级用户

who,echo,clear,``password常用命令

who命令

列出所有正在使用系统的用户、所用终端名和注册到系统的时间

who
[zouran@localhost ~]$ who
zouran   pts/0        2023-12-31 06:25 (192.168.195.1)
zouran   :0           2023-12-31 06:22 (:0)
who am i
[zouran@localhost ~]$ who am i
zouran   pts/0        2023-12-31 06:25 (192.168.195.1)

echo命令

将命令行中的参数显示到标准输出(即屏幕)上

[zouran@localhost ~]$ echo Hello World!
Hello World!
[zouran@localhost ~]$ echo 'Hello   World!'
Hello   World!
[zouran@localhost ~]$ echo Hello   World!
Hello World!

date命令

在屏幕上显示或设置系统的日期和时间 -u 世界时–格林尼治标准时间

[zouran@localhost ~]$ date -u
Wed Nov  8 11:59:03 UTC 2023

如果没有选项和参数,将直接显示系统当前的日期和时间

[zouran@localhost ~]$ date
Wed Nov  8 03:59:07 PST 2023

cal命令

显示公元1~9999年中任意一年或者任意一个月的日历

[zouran@localhost ~]$ cal
    November 2023   
Su Mo Tu We Th Fr Sa
          1  2  3  4
 5  6  7  8  9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30

列出公元10年的日历,而不是当年10月份的日历

[zouran@localhost ~]$ cal 10
                                10                                

       January               February                 March       
Su Mo Tu We Th Fr Sa   Su Mo Tu We Th Fr Sa   Su Mo Tu We Th Fr Sa
          1  2  3  4                      1                      1
 5  6  7  8  9 10 11    2  3  4  5  6  7  8    2  3  4  5  6  7  8
12 13 14 15 16 17 18    9 10 11 12 13 14 15    9 10 11 12 13 14 15
19 20 21 22 23 24 25   16 17 18 19 20 21 22   16 17 18 19 20 21 22
26 27 28 29 30 31      23 24 25 26 27 28      23 24 25 26 27 28 29
                                              30 31
#省略输出内容....
                       31
       October               November               December      
Su Mo Tu We Th Fr Sa   Su Mo Tu We Th Fr Sa   Su Mo Tu We Th Fr Sa
          1  2  3  4                      1       1  2  3  4  5  6
 5  6  7  8  9 10 11    2  3  4  5  6  7  8    7  8  9 10 11 12 13
12 13 14 15 16 17 18    9 10 11 12 13 14 15   14 15 16 17 18 19 20
19 20 21 22 23 24 25   16 17 18 19 20 21 22   21 22 23 24 25 26 27
26 27 28 29 30 31      23 24 25 26 27 28 29   28 29 30 31

列出2016年10月份的日历

[zouran@localhost ~]$ cal 10 2016
    October 2016    
Su Mo Tu We Th Fr Sa
                   1
 2  3  4  5  6  7  8
 9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31

clear命令

清除屏幕上的信息,它类似于DOS中的CLS命令

passwd命令

更改自己的密码

[zouran@localhost ~]$ passwd
Changing password for user zouran.
Changing password for zouran.
(current) UNIX password: 
New password: 
Retype new password: 
passwd: all authentication tokens updated successfully.

ls命令

ls命令列出指定目录的内容

#当前目录下
[zouran@localhost ~]$ ls 
Desktop  Documents  Downloads  Music  Pictures  Public  Templates  test  Videos
#指定目录[/home/zouran]下
[zouran@localhost ~]$ ls /home/zouran
Desktop  Documents  Downloads  Music  Pictures  Public  Templates  test  Videos

pwd命令

[zouran@localhost ~]$ pwd
/home/zouran

su命令

su命令可以更改用户的身份,如从超级用户root改到普通用户zouran [不需要密码],反之则需要密码

[zouran@localhost ~]$ su root
Password: 
[root@localhost zouran]# su zouran
[zouran@localhost ~]$ 

扩展选项

who命令

显示当前已注册到系统的所有用户名、所用终端名和注册到系统的时间

who -bwho --boot 显示系统最近引导的时间

[zouran@localhost ~]$ who -b
         system boot  2023-12-31 06:21

who -Hwho --heading 打印出各列的标题

[zouran@localhost ~]$ who --heading
NAME     LINE         TIME             COMMENT
zouran   pts/0        2023-12-31 06:25 (192.168.195.1)
zouran   :0           2023-12-31 06:22 (:0)

who -m 仅显示与stdin(标准输入)相关的主机名和用户

[zouran@localhost ~]$ who -m
zouran   pts/0        2023-12-31 06:25 (192.168.195.1)

echo命令

echo -n表示输出字符串STRING之后光标不换行

[zouran@localhost ~]$ echo -n "hello"
hello[zouran@localhost ~]$ 

echo -e 启用转义字符,允许在输出中使用转义序列

[zouran@localhost ~]$ echo -e hello'\n'world
hello
world
[zouran@localhost ~]$ echo -e "hello\nworld"
hello
world

date命令

date -d 显示由字符串STRING指定的时间,不是now

[zouran@localhost ~]$ date -d today +'%Y-%m-%d'
2023-12-31
[zouran@localhost ~]$ date -d today +'%Y-%m-%d %T'
2023-12-31 07:06:19

date -s设定由字符串STRING指定的时间

date –s 04/05/2020
date –s 20:30:33

date -u 显示或设定格林尼治时间

date -u --date=‘2 days ago’

文件概念

  1. 文件组成

    1.索引节点,又称I节点。系统利用其中的信息对相应文件实施控制和管理。这些信息包括文件权限、文件主、文件大小、存放位置、建立日期等

    2.文件的实际内容,它可以是空的,也可以非常大,并且有自己的结构

  2. 文件命名

    1.文件名应尽量简单,并且应反映出文件的内容

    2.Linux系统区分文件名的大小写

    3.以圆点(.)开头的文件名是隐含文件

  3. 文件类型
    1.普通文件

    文本文件,它由ASCII字符构成

    数据文件,它由来自应用程序的数字型和文本型数据构成

    可执行文件,它由机器指令和数据构成
    2.目录
    3.设备文件
    4.符号链接文件

  4. 文件名通配符

    1.星号(*)

    与0个或多个任意的字符相匹配。 le* 可代表letter, lease

    星号匹配的是当前目录下的所有文件,但以点(.)开头的隐含文件除外

    .*只与隐含文件匹配

    2.问号( ? )

    问号只与单个任意的字符匹配。你可以使用多个问号。 file? name.???

    3.方括号( [ ] )

    只与括号中列出的字符之一匹配。例如letter[123]

    可以用-代表一个范围内的字符,而不用将它们一一列出。如f[1-5]、f[12345]

    范围内的字符都按升序排列,即[A-Z]是有效的,而[Z-A]是无效的

    如果在 [ 之后是一个 ! 或 ^(shift+6) ,则表示与不在方括号中出现的字符匹配。

    上面介绍的所有符号都可以混和使用,例如:[!A-Z]*.?,代表所有不以大写字母开头,但倒数第二个位置是.的文件名

  5. 常用文件操作命令

    1.cat命令

    其一是经常用来显示文件的内容;其二是连接两个或多个文件

    $ cat m1             (在屏幕上显示文件m1的内容)
    $ cat m1 m2          (同时显示文件m1和m2的内容)
    $ cat m1 m2 > mfile     (将文件m1和m2合并后放入文件mfile中)
    $ cat -n m1         (对文件m1的各行编号并输出)
    

    2.more命令

    more命令显示文件内容,每次显示一屏

    more  -dc  mfile #先清屏,然后显示mfile的内容,并且在屏幕的最下方显示完整的百分比
    
    more  -c  -10  mfile #显示文件mfile的内容,每10行显示一次,而且在显示之前先清屏
    

    3.less命令

    用来分屏显示文件的内容。允许用户向前或向后浏览文件

    用PageUp键向上翻页,用PageDown键向下翻页。要退出 less 程序,可以按q、Q键,或者:q、:Q键,或者ZZ

    4.head命令

    在屏幕上显示指定文件的开头若干行。显示行数的默认值是10

    显示文件mfile的前5行

    head  -5  mfile             
    

    显示文件mfile除最后100个字节之外的所有内容。注意:“=”与“-”之间没有空格

    head  --bytes=-100  mfile    
    

    显示文件mfile的内容,并且给出文件名标题

    head  -v  mfile   
    

    显示文件mfile的内容,但不列出文件名标题

    head  -q  mfile   
    

    5.tail命令

    显示文件mfile的最后10行

    tail mfile
    

    显示文件mfile的内容,从第20至文件末尾

    tail -n 20 mfile
    

    显示文件mfile的最后10字符(字节)

    tail -c 10 mfile
    

    6.touch命令

    可以修改指定文件的时间标签或者创建一个空文件

    在当前目录下建立一个空文件ex2

    touch ex2
    

    将文件mfile的修改时间改为系统当前时间

    touch -m mfile
    

    显示mfile的atime ,ctime, mtime

    stat mfile
    

    指定修改的时间标签,mfile访问时间

    touch -a -d"2023-11-11 23:00:00" mfile
    

    7.file命令

    file命令对每个参数FILE进行检查,并予以分类。(仅当前目录下)

    8.grep命令

    该命令用来在文本文件中查找指定模式的词或短语,并在标准输出上显示包括给定字符串模式的所有行

    grep命令一次只能搜索一个指定的模式

    egrep命令等同于grep -E,可以使用扩展的字符串模式进行搜索

    fgrep命令等同于grep -F,是快速搜索命令,它检索固定字符串,但不识别正则表达式

image-20231109172619454 ![image-20231109173031076](https://img-blog.csdnimg.cn/img_convert/96515f53a251726efe1052637630aa4c.png)
常用选项

`-E`  将模式解释成扩展的正则表达式

`-F`     将模式解释成一系列以换行符分开的单纯的字符串,其中任何一个都可被匹配

`-b,--byte-offset` 在输出的每一行前面显示包含匹配字符串的行在文件中的位置,用字节偏移量来表示

`-c,--count` 只显示文件中包含匹配字符串的行的总数

`-f FILE,--file=FILE` 从文件FILE中获取模式,每行一个。空文件不含模式,因此,不做匹配(`grep -f fff1 fff2`)

在密码文件`/etc/passwd`中查找包含mengqc的所有行

```shell
grep mengqc /etc/passwd
```

先定位到`mengqc`目录的上一级,然后在`mengqc`及其子目录下的所有文件中查找字符串`print`出现的次数

```shell
cd ..
grep -r 'print'
```

在子目录`dir`下与正则表达式`f?.c`相匹配的各个文件中查找包含`main`或者`printf`的所有行,不管首字母的大小写

```shell
grep -E '[Mm]ain|[Pp]rintf' dir/f?.c
```

9.`sort`命令

逐行对指定文件中的所有行进行排序,并将结果显示在标准输出上

将文件mfile的前10行定向到文件h3333中

```shell
head -10 mfile > h3333
```

以第2个字段作为排序关键字,对文件more_h10排序

```
sort -k 2 more_h10
```

更改排序的分隔符

```shell
sort -t '-' more_h10
```

标识从第一列的第二个字符开始排序

```shell
sort -k 1.2 more_h10
```

10.`uniq`命令

`uniq`命令读取输入文件,并比较相邻的行,去掉重复的行,只留下其中的一行。(需是排好序的文件)

显示文件h3中不重复的行

```shell
uniq -u h3
```

显示文件h3中重复的行

```shell
uniq -d h3
```

11.`comm`命令

comm命令用来对两个已排序文件进行逐行比较

比较文件m1和m2,并且只显示它们共有的行

```shell
common -12 m1 m2
```

12.`diff`命令

该命令逐行比较两个文件,列出它们的不同之处,并且告诉用户,为了使两个文件一致,需要修改它们的哪些行。(不要求预先排好序)

该命令输出的一般形式如下:

* n1 a n3,n4 (把文件1的n1行附加到文件2的n3~n4行后,则二者相同)
* n1,n2 d n3 (删除文件1的n1~n2行及文件2的n3行,则二者相同)
* n1,n2 c n3,n4 (把文件1的n1~n2行改为文件2的n3~n4行,则二者相同)
* 字母a表示附加,字母d表示删除,字母c表示修改

13.`cp`命令

将文件mfile复制到目录/home/mengqc下,并改名为exam1

```shell
cp mfile /home/mengqc/exam1
```

将目录/home/mengqc下的所有文件及其子目录复制到目录/home/liuzh中 

```
cp -r /home/mengqc /home/liuzh
```

交互式地将目录/home/mengqc中以m打头的所有.c文件复制到/home/liuzh中

```shell
cp -i /home/mengqc/m*.c /home/liuzh
```

将指定文件复制到当前目录下

```shell
cp  ../mary/Homework/assign   . 
```

14.`rm`命令

该命令可以删除每个指定的文件,默认情况下,它不能删除目录(`rmdir`)

交互式删除

```shell
rm   -i  test  
```

删除所有

```shell
rm  -r   *       
```

15.`mv`命令

mv命令用来对文件或目录重新命名,或者将文件从一个目录移到另一个目录中

将文件ex3改名为new1

```shell
mv ex3 new1
```

将目录/home/mengqc中的所有文件移到当前目录(用“.”表示)中

```shell
mv /home/mengqc/* .
```

16.`wc`命令

统计文件mfile 和m2的字节数、字数和行数

```shell
wc mfile m2
```

第五章 目录及其操作

树形目录结构

/etc目录下包含许多Linux系统配置文件(如密码文件/etc/passwd、/etc/profile等)

/home目录是用户起始目录的基础目录。通常,用户的主目录就保存在该目录中

image-20231126192709067

绝对路径名与相对路径名

以根目录为起点的路径名称做绝对路径名,绝对路径名总是以斜线字符(/)开头,它表示根目录

相对当前工作目录的路径名,可以连续使用.. 形式表示父目录,'.'当前目录本身

用户及文件存取权限

四种文件权限

文件主、同组用户、其他用户、超级用户

文件主:文件所有者,并赋予唯一的注册名,只有文件主或root才有权利用chown命令改变文件的所有关系(UID)

用户组:通常,组中包含了有相同需求的用户。文件用户组关系的标识 是GID

用户存取权限:3种访问文件或目录的方式,r(读) w(写) x (可执行或查找)

文件存取权限

r(读权限):表示只允许指定用户读取相应文件的内容,而禁止对它做任何的更改操作。将所访问的文件的内容作为输入的命令都需要有读的权限,如cat,more等

w(写权限):表示允许指定用户打开并修改文件,如命令vi,cp等

x(执行权限):表示允许指定用户将该文件作为一个程序执行

目录存取权限

在ls命令后加上-d选项,可以了解目录文件的使用权限

r(读权限):表示可以列出存储在该目录下的文件,即读目录内容列表。这一权限允许shell使用文件扩展名字符列出相匹配的文件名。

w(写权限):表示允许从目录中删除或添加新的文件。通常只有目录主才有写权限(rmdir?)。

x(查找权限):表示允许在目录中进行查找,并能用cd命令将该目录改为工作目录。

mkdir命令

mkdir命令用来创建目录

-m,–mode=MODE 将新建目录的存取权限设置为MODE,存取权限用给定的八进制数字表示

-p,–parents 可一次建立多个目录,即如果为新建目录所指定的路径dirname中有些父目录尚不存在,此选项可以自动建立它们

在目录/root下建立子目录H2,并且只有文件主有读、写和执行权限,其他人无权访问

mkdir --mode=700 /root/H2

同时建立两个目录:H3和它的子目录H3.1,权限设置为文件主可读、写、执行,同组用户可读和执行,其他用户无权访问

mkdir -p -m 750 H3/H3.1

rmdir命令

rmdir命令可以从一个目录中删除一个或多个空的子目录,子目录被删除之前应该是空目录,当前工作目录必须在被删除目录之上,不能是被删除目录本身,也不能 是被删除目录的子目录,删除目录时,必须具有对其父目录的写权限

-p,–parents 递归删除目录dirname,当子目录删除后其父目录为空时,也一同被删除。如果有非空的目录,则该目录保留下来

删除子目录os_1和其父目录bin

rmdir -p /bin/os_1

cd命令

cd命令用来改变工作目录

将当前目录改到/home/liuzh

cd /home/liuzh

将当前目录改到用户的主目录

cd ~

或者

cd 

将当前目录改到根目录

cd /

返回刚才工作目录

cd -

将当前目录向上移动两级

cd ../../

pwd命令

pwd命令显示出当前工作目录的绝对路径

pwd

ls命令

ls命令列出指定目录的内容

-a,–all    显示指定目录下所有子目录和文件,包括以“.”开头的隐藏文件(如.cshrc)

-c 按文件的修改时间排序

| 表示管道文件

-i,–inode   在输出的第一列显示文件的I节点号

列出当前目录的内容,并标出文件的属性

ls -F

按多列形式列出目录/home/mengqc的内容

ls -C /home/mengqc

以长列表格式列出当前目录的内容,包括隐藏文件和它们的I节点号

ls -l -a -i 

链接文件的命令

硬链接:建立硬链接时,在另外的目录或本目录中增加目标文件的一个目录项, 这样,一个文件(如m2.c)就登记在多个目录中

不能对目录文件做 硬链接;不能在不同的文件 系统之间做硬链接

符号链接(软连接):是将一个路径名链接到一个文件。事实上,只是一个文 本文件,其中包含它提供链接的另一个文件的路径名

ln命令

-s,–symbolic 建立符号链接,而不是硬链接

将目录/home/mengqc/mub1 下的文件m2.c链接到目录/home/liuzh下的文件a2.c

ln /home/mengqc/mub1/m2.c /home/liuzh/a2.c

在目录/home/liuzh下建立一个符号链接文件abc,使它指向目录/home/mengqc/mub1

ln -s /home/mengqc/mub1 /home/liuzh/abc 

chmod命令

只有文件主或超级用户root才有权用chmod命令改变文件或目录的存取权 限(?)

一般格式: chmod [选项]… MODE[,MODE]… 文件…

MODE 由以下各项组成: [who] [操作符号] [mode]

操作对象who可以是下述字母中的任一个或者它们的组合

u(user ) g(group) o(others) a(all ,系统默认值)

操作符号可以是

添加 - 取消 = 赋予

mode所表示的权限可用下述字母的任意组合:r w x 等

将文件ex1的权限改为所有用户都有执行权限

chmod a+x ex1

将文件ex1的权限重新设置为文件主可以读和执行,组用户可以执行,其 他用户无权访问

若缺少o=则其他权限默认不改变

chmod u=rx,g=x,o= ex1

以绝对方式改变权限

使文件ex1的文件主和同组用户具有读、写权限,而其他用户只可读

066400664效果一致

chmod 664 ex1

采用chmod o+t当?录被设置了粘滞位权限(t)以后,即便?户对该?录有写?权限,也不能删除该?录中其他?户的?件数据,?是只有该?件的所有者和root?户才有权将其删除

umask命令

umask命令用来设置限制新建文件权限的掩码,当新文件被创建时,其最初的权限由文件创建掩码决定。用户每次注册进入 系统时,umask命令都被执行,并自动设置掩码mode来限制新文件的权限,用户可以通过再次执行umask命令来改变默认值,新的权限将会把旧的覆盖掉

不能直接利用umask命令创建一个可执行的文件,用户只能在其后利用 chmod命令使它具有执行权限

查看当前掩码的设置

字符形式(u=rwx,g=rx,o=rx)

umask -S

八进制形式

umask -p

设置掩码

字符形式

umask u=rwx,g=rx,o=

八进制形式

umask 0037

chgrp命令

chgrp命令用来改变文件或目录所属的用户组

chgrp [选项] GROUP FILE

将/home/mengqc及其子目录下的所有文件的用户组改为friend

错误示例

chgrp -r g=friend /home/mengqc 

正确语法

chgrp -R -v friend /home/mengqc

chown命令,只有超级用户或文件主才可以使用该命令

将目录/home/mengqc及其下面的所有文件、子目录的文件主改成liuzh

chown -R -v liuzh /home/mengqc

第六章 进程及其管理

ps命令

ps命令是查看进程状态的最常用的命令,它可以提供关于进程的许多信息

直接用ps命令可以列出每个与你的当前shell有关的进程的基本信息

ps

-e 显示所有进程的信息,等价于-A

-f 显示进程的所有信息

利用选项-ef可以显示系统中所有进程的全面信息

ps -ef

利用下面的命令可以显示所有终端上所有用户的有关进程的 所有信息

ps -aux

kill命令

kill命令通过向进程发送指定的信号用来终止一个进程的运行

撤销所有的后台作业

kill -0

终止某个进程,pid表示进程对应pid

kill -9 pid

sleep命令

sleep 时间值(默认秒)

使进程暂停由时间值所指定的秒数。此命令大多用于shell程序设计中,使 两条命令执行之间停顿指定的时间

下面的命令行使进程先暂停100秒,然后查看用户mengqc是否在系统中

sleep 100; who | grep 'mengqc'

nice命令

nice [选项] [命令…]

Linux系统中,进程的优先级取决于两个因素:进程剩余时间配额和进 程的优先数nice;优先数越小,其优先级越高

用户可以利用nice命令设定进程的nice值。但一般用户只能设定正值, 从而主动降低其优先级,只有特权用户才能把nice的值置为负数

其中,sh ./T1& 表示后台任务——调用shell命令来解释并执行当前目录 下的T1程序

nice –n sh ./T1& (默认nice值增加10)

nohup命令

nohup 命令 [参数]

nohup命令将忽略挂起信号对命令的影响而继续运行指定的命令(它可 以带参数)

nroffbook是一个shell脚本文件,它对一本书的手稿进行正文处理

nohup sh nroffbook&

wait命令

wait命令的功能就是等待指定的进程,并返回其终止状态(成功为0)

一般格式: wait [n] n可以是进程的ID或者作业描述符

df命令

命令df可以报告文件系统中未用磁盘空间的情况。按照默认,磁盘盘块 以1k字节为单位

如果使用-a选项,则把不占用磁盘空间的文件系统也列出来

du命令

命令du统计出每个目录占用磁盘空间的情况。该命令可以逐级进入每一 个子目录并显示该目录的磁盘利用情况

du –s (summarize总体情况)

du –a (同时显示目录+文件的磁盘利用情况)

文件压缩和解压缩

gzip命令

gzip命令用来对文件进行压缩和解压缩

gzip [选项] [name…]

-d,–decompress,–uncompress 将被压缩的文件进行解压缩

-l,–list 对每个压缩文件,列出以下字段

-v 对每个压缩文件和解压缩文件,显示其文件名和压缩比

-num 用指定的数字num 调整压缩速度,其中-1或–fast表示最快的压缩方法(低 压缩比),-9或–best表示最慢的压缩方法(高压缩比)。系统默认值为-6

把/home/mengqc/dir1目录下的每个文件都压缩成.gz文件

gzip /home/mengqc/dir1/*

把上面压缩的文件进行解压缩,并列出详细的信息

gzip -dv /home/mengqc/dir1/*

详细列出上面每个压缩文件的信息,但是不执行解压缩

gzip -l /home/mengqc/dir1/*

将/home/mengqc/dir1目录下的文件进行快速压缩,并显示其压缩比

gzip -v --fast /home/mengqc/dir1/*

unzip命令

unzip命令对ZIP格式的压缩文件进行解压缩。这种格式的压缩文件带有 后缀.zip

unzip [选项] 被压缩文件名

将压缩文件chapter1.zip在当前目录下解压缩

unzip chapter1.zip .

显示有关压缩文件的信息,但不作解压缩

unzip -v chapter1.zip

文本编辑

进入vi

在系统提示符(设为$ )下输入命令vi和想要编辑(建立)的文件名,便可进入 vi

vi example.c

退出vi

:wq 把编辑缓冲区的内容写到你编辑的文件中,退出编辑器,回到 shell下。(操作过程是,先键入冒号“ : ” ,再键入命令wq。以下命令操作同。)

:ZZ (大写字母ZZ)仅当作过修改时才将缓冲区内容写到文件上。

:x 与 :ZZ相同。

:q! 强行退出vi。感叹号(! )告诉vi,无条件退出,丢弃缓冲区内容

插入命令

i 插在光标位置之前

附加命令

a 在该命令之后输入的字符都插到光标之后

打开命令

o在光标所在行的下面新开辟一行,随后输入的文本就插入在这一行上

插入方式下光标移动

在键盘的右下方有四个方向键,利用它们可以在插入方式下移动光标。 利用(退格键)可将光标从当前行上回退一个字符,并且 删除光标之前的一个字符

光标移动命令

1701921068504

移至行首

使用命令(键)^ 或0(数字0)将光标移到当前行的开头

移至行尾

可以使用命令(键)$将光标移至当前行的行尾,停在最后一个字符上

移至指定行

可以使用命令(键)[行号]G将光标移至由行号所指定的行的开头

移至指定列 可以使用命令(键)[列号]| 将光标移至当前行指定的列上。(shift +|)

文本删除

删除文本对象

删除光标所在的整行;

dd

从光标位置开始删除到行尾

D

从光标位置(不包括光标位)删至行首

d0

从光标位置(包括光标位)向右删3个字符

d3l 

从光标位置(包括光标位)删至行尾与D相同

d$ 

将光标所在行至第5行都删除

d5G 

复原命令

u 取消前面刚执行的插入或删除命令的效果,恢复到此前的情况

重复命令

·(圆点)在命令方式下,重复执行前面最近一次插入命令或删除命令

修改命令

命令cc

命令cc删除光标所在行整行(不是行的一部分),用随后输入字符串替代。 其余作用与C命令相同

取代命令

命令r

命令r用随后输入的单个字符取代光标所在的字符

命令R

命令R用随后输入的文本取代光标所在字符及其右面的若干字符,每输 入一个字符就替代原有的一个字符

替换命令

命令s

命令s(小写)用随后输入的的正文替换光标所在的字符

C程序编译工具

gcc命令行选项

gcc file.c

执行完成后,生成默认的可执行文件a.out

gcc file.c -o hello

执行完成后,生成的可执行文件hello

The compiling Process of gcc

gcc -E hello.c -o hello.i
gcc -c hello.i -o hello.o
gcc hello.o -o hello

编译存在函数调用的.c

文件mfile.c中函数main调用了函数square,但在该文件中未定义 square。所以,不带选项就直接编译mfile.c是不行的

使用选项-c,分别编译mfile.c和sq.c文件;然后统一编译,生成的可执行代码 放在meng1文件中。最后执行meng1

gcc -c mfile.c
gcc -c sq.c
gcc mfile.o sq.o -o meng1
./meng1

启动gdb和查看内部命令

为了发挥gdb的全部功能,需要在编译源程序时使用-g选项

针对C语言源程序prog.c

gcc -g prog.c -o prog

针对C++源程序program.cpp

gcc -g program.cpp -o program

启动gdb的常用方法有

以一个可执行程序作为gdb的参数

 gdb prgm

同时以可执行程序和core文件作为gdb的参数

gdb prgm core

启动gdb后就显示其提示符:(gdb),并等待用户输入相应的内部命令

用户可以利用命令quit终止其执行,退出gdb环境

Use "run “ to run the program to see the errors in the program

Use "backtrace “ to view specific error messages

Use "frame number “ to view the possible program errors (numbers are in the results of the backtrace command execution)

Shell脚本的建立和执行

建立shell脚本

建立shell脚本的步骤同建立普通文本文件的方式相同

vi ex1

执行shell脚本的四种方式

 bash 脚本名 [参数]
. 脚本名 [参数]

shell脚本的权限设置为可执行,然后在提示符下直接执行它

chmod a+x ex2 
PATH=$PATH:.
ex2
chmod a+x ex2 
./ex2

简单shell变量

变量名=字符串,注意:在赋值号“=”的两边没有空格

myfile=/home/mengqc/ff/m1.c

引用变量值

在程序中引用变量值时,要在变量名前面加上一个“$”符号

 dir=/usr/meng/ff #注释为输出结果
 echo $dir #/usr/meng/ff
 echo dir #dir
 echo $Dir #

如果在赋给变量的值中含有空格、制表符或换行符,那么,就应该用双引 号把这个字符串括起来

names="ZhangSan Lisi WangWu"
echo $names #ZhangSan Lisi WangWu
names=ZhangSan LiSi WangWu
echo $names #bash: LiSi: command not found...

一个变量的值可以作为某个长字符串中的一部分。如果它在长字符串的 末尾,就可以利用直接引用形式

s="ing the file"
echo read$s and writ$s #reading the file and writing the file

如果变量值必须出现在长字符串的开头或者中间,为了使变量名与其后的 字符区分开,避免shell把它与其他字符混在一起视为一个新变量,则应该用 花括号将该变量名括起来

dir=/usr/meng
cat ${dir}qc/m1.c #将把文件/usr/mengqc/m1.c显示出来
cat $dirqc/m1.c  # 系统会给出错误信息

利用shell变量可为长字符串提供简写形式

dir1=/usr/meng/ff/prog
ls $dir1 #把目录/usr/meng/ff/prog的内容列出来
cat $dir1/exam.c #把上述目录中的exam.c文件显示出来

数组

对数组元素赋值的一般形式是:数组名[下标]=值

city[0]=BeiJing
city[1]=ShangHai

用declare命令显式声明一个数组,一般形式是

declare -a 数组名

读取数组元素值的一般格式是

${数组名[下标]}
${arrary[0]}

数组初始化的一般形式是

数组名=(值1 值2 … 值 ) (空格隔开

A=(this is a example)
echo ${A[0]} ${A[1]} ${A[5]}
#   	this	is			#不存在的输出为空

使用*或@作为下标,则表示数组中所有元素

A=(this is a example)
echo ${A[@]} #this is a example
echo ${A[*]} #this is a example

unset取消数组的定义

unset week \ unset week[*]或unset week[@]、unset week[4]

位置参数

位置参数

它们与命令行上具体位置的实参相对应:命令名(脚本名)对应变量0,第一个 实参对应变量1,第二个实参对应变量2,……,所以这类变量称为位置变量

这种变量不能用赋值语句直接赋值,只能通过命令行上对应位置的实参传 值

$0始终表示命令名或shell脚本名

shift命令

用shift命令移动位置参数

命令行: ex7 A B C D E F

原位置参数: $0 $1 $2 $3 $4 $5 $6

移位后位置参数: $0 $1 $2 $3 $4 $5

cat exam
echo $0 $1 $2 $3 $4 $5
shift
echo $0 $1 $2 $3 $4 $5
shift 2
echo $0 $1 $2 $3 $4 $5
[zouran@localhost shell]$ ./exam A B C D E F G H I J K
./exam A B C D E
./exam B C D E F
./exam D E F G H

用set命令为位置参数赋值

set meng1.c meng2.c   #(两个文件名)
cat $1 $2 $3 | wc -l  #(统计位置参数文件的总行数)
$ cat  meng1.c
#include <stdio.h>
main()
{
  int r;
  printf("Enter an integer, please!\\n");
  scanf("%d",&r);
  square(r);
  return0;
}
$ cat  meng2.c
#include  <stdio.h>
int  square(int  x)
{
  printf("The square=%d\\n", x?x);
  return(x?x);
}
$ cat exam4
#!/bin/bash
# exam4:shell script to combine files and count lines
# using command set to set positional parameters
set meng1.c meng2.c
cat $1 $2 $3|wc -l
# end
$ exam4
16

预先定义的特殊变量

$#——除脚本名外,命令行上参数的个数

$*——表示在命令行上实际给出的所有实参

./exam3 A B C D E F G H I J K

$*就是A B C D E F G H I J K

$*就等价于$1 $2 $3

$@—它与$*基本功能相同,$1 $2,在上面情况下,就是"A" “B” “C”……“K”

环境变量

HOME:用户主目录的全路径名。如/home/myname

LOGNAME:即用户注册名

PWD:当前工作目录的路径

PATH:shell查找命令的路径(目录)列表,各个目录用冒号(:)隔开。 用户可以设置它: $ PATH= P A T H : PATH: PATH:PWD

PS1:shell的主提示符。 $ PS1="$LOGNAME> "

SHELL:当前使用的shell。通常,它的值是/bin/bash

TERM:终端类型

MAIL:系统信箱的路径

可以用env命令列出当前环境下的所有环境变量及其值,也可用echo命令 察看任何一个环境变量的值

当更改了环境变量的值以后,往往利用export命令将这些变量输出,使它 们成为公用量

算术运算

let命令

bash中执行整数算术运算的命令是let,其语法格式为: let arg … 其中,arg是单独的使用C语言语法的算术表达式。如 let "j=i*6+2"

Let 命令的替代表示形式是: ((算术表达式)) 如 ((j=i*6+2))

运算符及其优先级和结合性

其运算符及其优先级和结合性基本上与C语言的相同; 还提供了方幂运算符“**” ,其优先级比* 、/高一级

当表达式中有shell的特殊字符时,必须用双引号将其括起来。例如,let "val=a|b"

只有使用$((算术表达式))形式才能返回表达式的值

echo "((9*9))"  #((9*9))
echo "$((9*9))" #81

read命令

echo -n "Input a year:"
read year
let "leap=year%400==0||(year%4==0&&year%100!=0)"
if [ $leap -eq 1 ]
then
echo "${year} is run nian"
else
echo "${year} is not run nian"
fi

echo命令

显示其后的变量值或者直接显示它后面的字符串

-n :参数显示后,光标不换行

-e:后面的参数中可以有转义字符,用于输出控制字符格式

-E:使后面的转义字符失去作用,默认解释成普通字符

echo -e "a\tb"
a	b
echo  "a\tb"
a\tb

输入/输出重定向

输入重定向符

一般形式是:命令 < 文件名 让命令;(或可执行程序)从指定文件中取得输入数据

score < file1 
wc<exam7

输出重定向符

一般形式是:命令 > 文件名;把命令(或可执行程序)执行的结果输出到指定的文件

who > abc

输出附加定向符

一般形式是: 命令>>文件名 把命令(或可执行程序)的输出附加到指定文件的后面,而该文件原有内 容不被破坏

date>> file2

shell特殊字符和命令语法

引号

双引号

由双引号括起来的字符(除$、倒引号(`)和转义字符(\)外)均作为 普通字符对待

echo "current dir is `pwd`" #current dir is /home/zouran/shell
echo "home dir is $HOME"    #home dir is /home/zouran
echo "file*.?"              #file*.?
echo "home dir is '$HOME'"  #home dir is '/home/zouran'
echo "FileName is No\$\*"   #FileName is No$\*

单引号

由单引号括起来的所有字符都作为普通字符出现

str='echo "current dir is `pwd`"'
echo $str #echo "current dir is `pwd`"

倒引号

用倒引号括起来的字符串被shell解释为命令行;可以将一个命令的执行结果赋给变量,即命令替换

一般形式是:变量名= `命令表` 例如:dir= ` pwd` 另一种形式是:变量名=$(命令表) 例如:dir=$(pwd)

users=`who |wc -l`
echo The numbers of users is $users  #The numbers of users is 1
Numbers=`echo The number of users is \`who | wc -l \``
echo $Numbers 						#The numbers of users is 1

注释、管道线和后台命令

注释

shell程序中以“#开头的正文行表示注释

管道线

 ls -l $HOME | wc –l

执行时,前一个命令的输出正好是下一个命令的输入

ls | grep m?.c | wc –l

后台命令,后台进程的调度优先级都低于前台进程的优先级

 gcc m1.c m2.c -o prog&

命令执行操作符

顺序执行

各条命令之间以分号(;)隔开,从左到右依次执行

 pwd ; who | wc -l ; cd /home/bin

逻辑与

一般形式:命令1 && 命令2

先执行命令1,如果成功,才执行命令2;否则,不执行命令2

cp ex1 ex10 && rm ex1

逻辑或

一般形式:命令1 || 命令2

先执行命令1,如果不成功,则执行命令2;否则,不执行命令2

 cat abc || pwd

用&&或||可以把多个命令联系起来

复合命令

{ }形式

以{ }括起来的全部命令可视为语法上的一条命令,出现在管道符的一边。成 组命令的执行顺序是根据命令出现的先后次序,由左至右执行

应注意,左括号“{”后面应有一个空格;右括号“}”之前应有一个分号(;)

( )形式

二者执行过程相同,但存在重要区别

{ }成组命令只在本shell内执行命令表,不产生新的进程;

而()成组命令在新的子shell内执行,要建立新的子进程

区别如下

[zouran@localhost ~]$ a="current value" ;export a
[zouran@localhost ~]$ echo a
a
[zouran@localhost ~]$ echo $a
current value
[zouran@localhost ~]$ (a="curent value-1";echo $a)
curent value-1
[zouran@localhost ~]$ echo $a
current value
[zouran@localhost ~]$ {a="current value-2";echo $a}
bash: {a=current value-2: command not found...
current value}
[zouran@localhost ~]$ { a="current value-2";echo $a;}
current value-2
[zouran@localhost ~]$ echo $a
current value-2
[zouran@localhost ~]$ cd /shell
-bash: cd: /shell: No such file or directory
[zouran@localhost ~]$ cd shell
[zouran@localhost shell]$ echo $a
current value-2
[zouran@localhost shell]$ (cd ../;pwd)
/home/zouran
[zouran@localhost shell]$ pwd
/home/zouran/shell
[zouran@localhost shell]$ { cd ../;}
[zouran@localhost ~]$ pwd
/home/zouran

程序控制结构

if语句

if [] thenelif [] thenelsefi

条件测试

条件测试有三种常用形式

test命令,如: test -f " $1 "

用一对方括号将测试条件括起来,如:[ -f “$1” ]

[[条件表达式]]的形式

有关字符串方面的测试

有关数值方面的测试

逻辑运算符

⑴ ! 表示逻辑非,[ ! -r “$1” ]``或! test -r "$1"

⑵ -a 表示逻辑与,[ -f "$myfile" –a -r "$myfile" ]

⑶ -o 表示逻辑或,[ "$a" -ge 0 -o "$b" -le 100 ]

注:引用变量时加上"",理由如下,引自ChatGPT3.5

在 Bash 脚本中,使用双引号包围变量是为了防止由于变量的内容包含空格或其他特殊字符而导致的问题。在上述条件表达式中,"$a""$b" 使用了双引号,这是一个良好的编程习惯,特别是当变量中包含可能被解释为特殊字符的内容时。

考虑以下情况:

a="some value with spaces"
b="50"
[ "$a" -ge 0 -o "$b" -le 100 ]

如果不使用引号,条件表达式将会变成:

[ some value with spaces -ge 0 -o 50 -le 100 ]

在这种情况下,Shell 将会报错,因为条件表达式的格式不正确。通过使用双引号,我们确保了变量的内容被视为单个实体,避免了由于空格或其他特殊字符引起的问题。

因此,虽然在简单的比较中可能不会引起问题,但在实际编程中,为了更好地处理各种情况,保持变量的引号形式是一个好的做法。

while语句

while语句的一般形式是:

while 测试条件 

do 
命令表 

done

循环测试位置参数是否为空

while [ $1 ]
do
if [ -f $1 ]
then echo "display : $1 "
cat $1
else echo "$1 is not a file name . "
fi
shift
done

编写一个脚本,求费波纳奇(Fibonacci)数列的前10项及总和


until语句

until语句的一般形式是:

until 测试条件 

do 

命令表 

done

当测试条件为假时,才进入循环体,直至测试条件为真时终止循环

这个脚本的目的是复制一系列的文件到指定的目标路径,直到遇到空格为止。在最后,如果还有未处理的参数,输出错误消息

until [ "$2" = " " ]
do
cp $1 $2
shift 2
done
if [ "$1" != " " ]
then echo "bad argument ! "
fi

使用方法

bash script.sh source_file destination1 source_file2 destination2 ...

for语句

值表方式

其一般格式是:

for 变量 [in 值表 ] 

do 

命令表

done
for day in Monday Wednesday Friday Sunday
do
echo $day
done

值表可以是文件正则表达式,其一般格式为:

for 变量 in 文件正则表达式
do
命令表
done
for file in m *.c
do
cat $file
done

值表还可以是全部位置参数,此时for语句的书写格式一般是

for 变量 in $* 
do 
命令表 
done

算术表达式方式

其一般格式是:

for ((e1;e2;e3)) 
do 
命令表 
done

打印给定行数的*号。第一行打印1个,第二行打印2个,等等。行数由用 户在命令行上输入


case语句

case 字符串 in
模式字符串1) 命令
…
命令;;
模式字符串2) 命令
…
命令;;
…
模式字符串n) 命令
…
命令;;
esac

break、 continue和exit命令

break命令

语法格式是: break [ n] (n表示跳出几层循环体,默认值1,表示只跳出一层循 环)

continue命令

continue命令跳过循环体中在它之后的语句,回到本层循环的开头,进行 下一次循环。

其语法格式是: continue [ n ]

利用exit命令可以立即退出正在执行的shell脚本。

其语法格式是: exit [ n ]

shell函数和内置命令

shell函数

其定义格式为:

[function] 函数名( ) 
{ 
命令表
}

函数应先定义,后使用(开头位置)

showfile( )
{
if [ -d "$1" ]
then cd "$1"
cat m* . c | pr
else echo "$1 is not a directory ."
fi
echo "End of the function . "
}

函数调用(直接用函数名不带圆括号)

showfile /home/file

shell内置命令

shell是终端用户与操作系统之间的一种界面。实现命令的常见方式有外置 方式和内置方式两种

外置方式

系统的大多数命令都采用这种方式实现,即每条外置命令都对应专门的系统 程序,通常以可执行文件的形式存放在盘上。 外置命令是通过创建子进程,并在子进程的空间中执行的

内置方式

内置方式的命令解释程序本身就包含执行该命令的代码。 内置命令在终端进程的地址空间内执行,并不创建新进程,即终端进程在接 收到某个内置命令后,就跳转到自己的相应代码区,在那里设置参数并且执 行相应的系统调用

前面介绍过的命令中,有些就是内置命令,包括: break[n],continue[n],cd,echo, exit[n],export,kill,let,pwd,read,return[n],shift[n],test,umask,wait

eval命令

读取参数arg——通常是另外的命令行,进行相应的变量替换或命令替 换,并把替换结果连成一个新的命令行,然后加以执行(1+1两次执行)

[zouran@localhost shell]$ pipe="|"
[zouran@localhost shell]$ "date $pipe wc -c"
bash: date | wc -c: command not found...
[zouran@localhost shell]$ eval date $pipe wc -c
29

exec命令

exec命令的常用格式是: exec [命令 [ args ]] 调用并执行指定的命令 exec命令通常用在shell脚本程序中,可以调用其他的命令

如果在当前 终端中使用命令,则当指定的命令执行完毕后会立即退出终端

用命令取代本shell,并不创建新进程

(shell关闭)

exec ls

readonly命令

readonly命令的常用格式是: readonly [ name … ] 标记给定的name变量是只读的,不能通过赋值语句改变其值

列出所有只读变量的清单

readonly

type命令

type命令的常用格式是:type name [ name … ]

指出对于每一个name,它是如何被解释的

type cd echo who

结果

cd is a shell builtin
echo is a shell builtin
who is /usr/bin/who

shell脚本调试

解决环境设置问题

环境设置不对通常包括以下情况

不能直接在其他shell下运行bash脚本;解决的办法是在脚本的 第一行写

#!/bin/bash

在PATH环境变量中没有包括“.”(当前目录),解决办法是设 置PATH:

PATH=$PATH:.

脚本文件与已存在命令的名字相同

解决脚本错误

基本的错误类型有两种:语法错误和逻辑错误

语法错误是编写程序时违反了所用编程语言的规则而造成的

逻辑错误通常是由于程序的逻辑关系存在问题。对此类问题需要进行程序调 试

使用set -x命令:设置x标志后,执行下面命令前先显示该行的内容

使用bash –x命令:在启动shell时,将它设置成跟踪模式

Shell补充内容

遍历一个文件夹下所有文件,输出其下文件类型,输出内容重定向到output.txt

eg1

filenames=${1}/*
for i in $filenames
do
 if [ -d $i ]
 then
 echo "$i is a directory!"
 elif [ -f $i ]
 then
 echo "$i is a file!"
fi
done > output.txt

参数为当前工作目录

eval ./eg1 `pwd`

循环将数字写入文件

eg2

for((a=1;a<5;a++))
do 
echo "The is number ${a}"
done > number.txt
echo "The command is finished!"
cat number.txt
The is number 1
The is number 2
The is number 3
The is number 4

处理循环的输出

eg3

for state in "North Dakota" Connecticut lllions Alabama Tennessee
do
 echo "$state is the next place to go"
done | sort
echo "This completes our travels"

输出

Alabama is the next place to go
Connecticut is the next place to go
lllions is the next place to go
North Dakota is the next place to go
Tennessee is the next place to go
This completes our travels

从命令读取值

eg4

file="states"
for state in $(cat $file)
do 
echo "Visit beautify $state"
done

states内容如下

Alabama
Alaska
Arizona
Los Angeles
bash eg4

输出

Visit beautify Alabama
Visit beautify Alaska
Visit beautify Arizona
Visit beautify Los
Visit beautify Angeles

更改字段分隔符

特殊环境变量IFS(internal field separator) 内部字段分隔符

默认分隔符:空格、制表符、换行符

在处理可能含有空格的数据(如文件名)时会非常麻烦,可以临时修改IFS环境 变量的值来限制被bash shell当做字段分隔符的字段。例如,如果想修改IFS的值 ,使其只能识别换行符,那么就必须这么做

IFS=$‘\n’

在Bash中,$'\n' 表示将字符串转义为特定的控制字符或转义序列。在这里,$'\n' 表示一个包含换行符的字符串

在正常的单引号字符串中,\n 被当作普通的字符,而不是换行符。但是,在 $'...' 这种形式中,$'...' 是一种特殊的语法,Bash 会将其中的转义序列进行替换

所以,$'\n' 表示一个字符串,其中的 \n 被替换为实际的换行符。这在设置 IFS 或其他需要转义字符的场景中很有用

对于上述例子

修改eg4后如下

eg5

file="states"
IFS=$'\n' #修改处
for state in $(cat $file)
do 
echo "Visit beautify $state"
done

输出

bash eg5
Visit beautify Alabama
Visit beautify Alaska
Visit beautify Arizona
Visit beautify Los Angeles

综合案例解析1:查找可执行文件

当从命令行中运行一个程序时,Linux系统会搜索一系列目 录来查找对应的文件,这些目录被定义在环境变量PATH中

如果你想找出系统中有哪些可执行文件可供使用,只需要扫描PATH环境变量中所有的目录就行了

查看PATH

echo $PATH

输出

/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/zouran/.local/bin:/home/zouran/bin:.
IFS=:
for folder in $PATH
do
echo "$folder"
for file in ${flode}/*
do
 if [ -x $file ]
 then 
  echo "    $file"
 fi
done
done

综合案例解析2:创建多个用户账户

shell脚本的目标是让系统管理员(root)过 得更轻松

批量创建多个系统账户

可以将电子表格文件.csv中的账户列表批量 读入系统中,为且创建系统账户

文件格式 userid, user name;,作为分隔符

users.csv

test1,ranzou
test2,rzzz

example2

input="users.csv"
while IFS=',' ;read userid name
do 
 echo "add $userid"
done<"$input"
文章来源:https://blog.csdn.net/qq_64373418/article/details/135359272
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。