Linux

在 Linux 操作系统中,所有的文件和目录都被组织成以一个根节点“/”开始的倒置的树状结构

img

Linux_第1张图片

Linux_第2张图片

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

  • 相对路径:
    相对路径不是从根目录 / 开始写起,而是从当前所在的工作目录开始写起。,例如由 /usr/share/doc 要到 /usr/share/man 底下时,可以写成: cd …/man 这就是相对路径的写法。

Linux常用命令

命令基本格式

Linux 命令的基本格式:

[root@localhost ~]# 命令[选项][参数]

命令提示符

Linux 系统的命令提示符

  • []:这是提示符的分隔符号,没有特殊含义。
  • root:显示的是当前的登录用户,笔者现在使用的是 root 用户登录。
  • @:分隔符号,没有特殊含义。
  • localhost:当前系统的简写主机名。
  • ~:代表用户当前所在的目录,此例中用户当前所在的目录是家目录。
  • #:命令提示符,Linux 用这个符号标识登录的用户权限等级。如果是超级用户,提示符就是 #;如果是普通用户,提示符就是 $。

处理目录的常用命令

接下来我们就来看几个常见的处理目录的命令吧:

 ls(英文全拼:list files): 列出目录及文件名
 cd(英文全拼:change directory):切换目录
 pwd(英文全拼:print work directory):显示目前的目录
 mkdir(英文全拼:make directory):创建一个新的目录
 rmdir(英文全拼:remove directory):删除一个空的目录
 cp(英文全拼:copy file): 复制文件或目录
 rm(英文全拼:remove): 移除文件或目录
 mv(英文全拼:move file): 移动文件与目录,或修改文件与目录的名称

你可以使用 man [命令] 来查看各个命令的使用文档,如 :man cp。

常用按键

Ctrl+c
使用 Ctrl+c 键来强行终止当前程序(你可以放心它并不会使终端退出)。
按键 作用
Ctrl+d 键盘输入结束或退出终端
Ctrl+s 暂停当前程序,暂停后按下任意键恢复运行
Ctrl+z 将当前程序放到后台运行,恢复到前台为命令fg
Ctrl+a 将光标移至输入行头,相当于Home
Ctrl+e 将光标移至输入行末,相当于End
Ctrl+k 删除从光标所在位置到行末
Alt+Backspace 向前删除一个单词
Shift+PgUp 将终端显示向上滚动
Shift+PgDn 将终端显示向下滚动
Shell 常用通配符
字符 含义
* 匹配 0 或多个字符
? 匹配任意一个字符
[list] 匹配 list 中的任意单一字符
[^list] 匹配 除 list 中的任意单一字符以外的字符
[c1-c2] 匹配 c1-c2 中的任意单一字符 如:[0-9][a-z]
{string1,string2,...} 匹配 string1 或 string2 (或更多)其一字符串
{c1..c2} 匹配 c1-c2 中全部字符 如{1…10}

常用命令

命令

命令可以是下面四种形式之一:

  1. 是一个可执行程序,就像我们所看到的位于目录/usr/bin中的文件一样。属于这一类的程序,可以编译成二进制文件,诸如用 C 和 C++ 语言写成的程序,也可以是由脚本语言写成的程序,比如说 shell,perl,python,ruby,等等。
  2. 是一个内建于 shell 自身的命令。bash 支持若干命令,内部叫做 shell 内部命令 (builtins)。例如,上面我本地环境中的 cd 命令,就是一个 shell 内部命令。
  3. 是一个 shell 函数。这些是小规模的 shell 脚本,它们混合到环境变量中。 比如上面讲到的 cd 命令,在某些环境中就是一个 shell 函数。
  4. 是一个命令别名。我们可以定义自己的命令,建立在其它命令之上。

ls (列出目录)

在Linux系统当中, ls 命令可能是最常被运行的。

语法:

[root@www ~]# ls [-aAdfFhilnrRSt] 目录名称
[root@www ~]# ls [--color={never,auto,always}] 目录名称
[root@www ~]# ls [--full-time] 目录名称

选项与参数:

-a –all 列出目录下的所有文件,包括以 . 开头的隐含文件
-l 除了文件名之外,还将文件的权限、所有者、文件大小等信息详细列出来
-h –human-readable 以容易理解的格式列出文件大小(例如 1K 234M 2G)
-t 以文件修改时间排序
-d 仅列出目录本身,而不是列出目录内的文件数据(常用)

将家目录下的所有文件列出来(含属性与隐藏档)

[root@www ~]# ls -al ~

仅列出目录本身,而不是列出目录内的文件数据(常用)

ls -a -l /home
ls -al /home

d 表示目录(directory), - 表示文件,文件和目录显示的颜色也不同

以容易理解的格式列出/home目录中所有的文件目录的大小

ls -alh /home

cd (切换目录)

cd是Change Directory的缩写,这是用来变换工作目录的命令。

语法:

 cd [相对路径或绝对路径]
#使用 mkdir 命令创建 runoob 目录
[root@www ~]# mkdir runoob

#使用绝对路径切换到 runoob 目录
[root@www ~]# cd /root/runoob/

#使用相对路径切换到 runoob 目录
[root@www ~]# cd ./runoob/

# 表示回到自己的家目录,亦即是 /root 这个目录
[root@www runoob]# cd ~

# 表示去到目前的上一级目录,亦即是 /root 的上一级目录的意思;
[root@www ~]# cd ..
  • 从当前目录进入系统根目录
cd /
  • 从当前目录进入父目录 … 表示父目录
cd ..
  • 从当前目录进入当前用户主目录
    表示当前用户主目录,注意它与系统根目录不是同一个概念。
cd ~
  • 从当前目录进入上次所在目录 - 表示上次进入的目录
cd -

pwd

用 pwd 命令来查看“当前工作目录”的完整路径

pwd 命令是 Print Working Directory 的缩写。

命令格式

pwd [选项]

常用参数

参数 描述
-P 显示实际物理路径,而非使用连接(link)路径
-L 当目录为连接路径时,显示连接路径

**例一:**显示当前目录所在路径,可以使用如下命令:

pwd

**例二:**显示当前目录的物理路径,可以使用如下命令:

pwd -P

**例三:**显示当前目录的连接路径,可以使用如下命令:

pwd -L

mkdir

mkdir 命令用来创建指定名称的目录,要求创建目录的用户在当前目录中具有写权限,并且指定的目录名不能是当前目录中已有的目录。

mkdir 命令是 make directory 的缩写。

命令格式

mkdir [选项] 目录

常用参数

参数 描述
-m --mode=模式 设定权限<模式>
-p --parents 可以是一个路径名称。若路径中的某些目录尚不存在,加上此选项后,系统将自动建立好那些尚不存在的目录,即一次可以建立多个目录
-v --verbose 每次创建新目录都显示信息

rm

rm 是常用的命令,该命令的功能为删除一个目录中的一个或多个文件或目录,它也可以将某个目录及其下的所有文件及子目录均删除。对于链接文件,只会删除链接,原文件均保持不变。

rm 是一个危险的命令,使用的时候要特别当心,尤其对于新手,否则整个系统就会毁在这个命令(比如在/(根目录)下执行 rm * -rf)。

所以,我们在执行 rm 之前最好先确认一下在哪个目录,到底要删除什么东西,操作时保持高度清醒的头脑。

rm 命令是 remove 的缩写。

命令格式

rm [选项] 文件或目录

常用参数

参数 描述
-f --force 忽略不存在的文件,从不给出提示
-i --interactive 进行交互式删除
-r --recursive 指示 rm 将参数中列出的全部目录和子目录均递归地删除
-v --verbose 详细显示进行的步骤

删除后缀名为.log 的所有,删除前逐一询问,可以使用如下命令:

rm *.log 或 rm -i *.log

mv

mv 命令功能是用来移动文件或更改文件名,经常用来备份文件或者目录

mv 命令根据第二个参数类型(目标是一个文件还是目录),决定执行将文件重命名或将其移至一个新的目录中。

当第二个参数类型是文件时,mv 命令完成文件重命名,此时,源文件只能有一个(也可以是源目录名),它将所

给的源文件或目录重命名为给定的目标文件名。

当第二个参数是已存在的目录名称时,源文件或目录参数可以有多个,mv 命令将各参数指定的源文件均移至目标

目录中。

mv 命令是 move 的缩写。

命令格式

mv [选项] 源文件或目录 目标文件或目录

常用参数

参数 描述
-b --back 若需覆盖文件,则覆盖前先行备份
-f --force 如果目标文件已经存在,不会询问而直接覆盖
-i --interactive 若目标文件已经存在时,就会询问是否覆盖
-u --update 若目标文件已经存在,且源文件比较新,才会更新
-t --target 该选项适用于移动多个源文件到一个目录的情况,此时目标目录在前,源文件在后

**例一:**将文件shiyanlou.log重命名为zhou.log

mv shiyanlou.log zhou.log

**例二:**将文件zhou.log移动到 test 目录下(test 目录必须已经存在,否则执行重命名)

mv zhou.log test

**例三:**将文件a.txt移动到 test1 目录下,如果文件存在,覆盖前会询问是否覆盖

mv -i a.txt test1

cp

cp 命令用来复制文件或者目录

一般情况下,shell 会设置一个别名,在命令行下复制文件时,如果目标文件已经存在,就会询问是否覆盖,不管你是否使用 -i 参数。

但是如果是在 shell 脚本中执行 cp 时,没有 -i 参数时不会询问是否覆盖。这说明命令行和 shell 脚本的执行方式有些不同。

cp 命令是 copy 的缩写。

命令格式

cp [选项] 源文件 目录 cp [选项] -t 目录 源文件

常用参数

参数 描述
-t --target-directory 指定目标目录
-i --interactive 覆盖前询问(使前面的 -n 选项失效)
-n --no-clobber 不要覆盖已存在的文件(使前面的 -i 选项失效)
-s --symbolic-link 对源文件建立符号链接,而非复制文件
-f --force 强行复制文件或目录,不论目的文件或目录是否已经存在
-u --update 使用这项参数之后,只会在源文件的修改时间较目的文件更新时,或是对应的目的文件并不存在,才复制文件

**例一:**对文件shiyanlou.log建立一个符号链接syl.log,可以使用如下命令:

cp -s shiyanlou.log syl.log

**例二:**将 test1 目录下的所有文件复制到 test2 目录下,覆盖前询问,可以使用如下命令:

cp -i test1/* test2

cat

cat 命令的功能是将文件或标准输入组合输出到标准输出

这个命令常用来显示文件内容,或者将几个文件连接起来显示,或者从标准输入读取内容并显示,它常与重定向符号配合使用。

cat 命令是 concatenate 的缩写。

命令格式

cat [选项] [文件]

常用参数

参数 描述
-A --show-all 等价于 -vET
-b --number-nonblank 对非空输出行编号
-e 等价于 -vE
-E --show-ends 在每行结束处显示 $
-n --number 对输出的所有行编号,由 1 开始对所有输出的行数编号
-s --squeeze-blank 有连续两行以上的空白行,就代换为一行的空白行
-t 与 -vT 等价
-T --show-tabs 将跳格字符显示为 ^I
-u (被忽略)
-v --show-nonprinting 使用 ^ 和 M- 引用,除了 LFD 和 TAB 之外

**例一:**把shiyanlou.log的文件内容加上行号后输入zhou.log这个文件里,可以使用如下命令:

zhou.log 里面有内容的话,会被覆盖,没有的话,就直接复制

cat -n shiyanlou.log > zhou.log

**例二:**把shiyanlou.log的文件内容加上行号后输入zhou.log这个文件里,多行空行换成一行输出,可以使用如下命令:

cat -ns shiyanlou.log > zhou.log

说明:tac 是将 cat 反写过来,所以它的功能就跟 cat 相反,cat 是由第一行开始到最后一行连续显示在屏幕上,而 tac 则是由最后一行开始到第一行反向在屏幕上显示出来。

nl

nl 命令在 linux 系统中用来计算文件中的行号

nl 可以将输出的文件内容自动加上行号,其默认的结果与 cat -n 有点不太一样。 nl 可以将行号做较多的显示设计,包括位数与是否自动补齐 0 等等的功能。

nl 命令是 number of lines 的缩写。

命令格式

nl [选项] [文件]

常用参数

参数 描述
-b 指定行号指定的方式,主要有两种:
-b a 表示不论是否为空行,也同样列出行号(类似 cat -n)
-b t 如果有空行,空的那一行不要列出行号(默认值)
-n 列出行号表示的方法,主要有三种:
-n ln 行号在屏幕的最左方显示
-n rn 行号在自己栏位的最右方显示,且不加 0
-n rz 行号在自己栏位的最右方显示,且加 0
-w 行号栏位的占用的位数

more

more 命令,功能类似 cat ,cat 命令是将整个文件的内容从上到下显示在屏幕上

more 命令会一页一页的显示,方便使用者逐页阅读,而最基本的指令就是按空格键(space)往下一页显示,按 B 键就会往回(back)一页显示,而且还有搜寻字串的功能。

more 命令从前向后读取文件,因此在启动时就加载整个文件。

命令格式

more [选项] 文件

常用参数

参数 描述
+n 从笫 n 行开始显示
-n 定义屏幕大小为 n 行
+/pattern 在每个档案显示前搜寻该字串(pattern),然后从该字串前两行之后开始显示
-c 从顶部清屏,然后显示
-d 提示“Press space to continue,’q’ to quiet”,禁用响铃功能
-p 通过清除窗口而不是滚屏来对文件进行换页,与-c 选项相似
-s 把连续的多个空行显示为一行
-u 把文件内容中的下划线去掉

常用操作

符号 描述
= 输出当前行的行号
q 退出 more
空格键 向下滚动一屏
b 返回上一屏

**例一:**从第五行开始显示shiyanlou.log文件中的内容

more +5 shiyanlou.log

**例二:**从shiyanlou.log文件中查找第一个出现“g”字符串的行,并从该处前两行开始显示输出

more +/g shiyanlou.log

**例三:**设定每屏行数为 5

more -5 shiyanlou.log

**例四:**使用 ll 和 more 命令显示/etc目录信息,可以使用如下命令:

ll /etc | more -10

less

less 命令也是对文件或其它输出进行分页显示的工具,应该说是 linux 正统查看文件内容的工具

命令格式

less [选项] 文件

常用参数

参数 描述
-e 当文件显示结束后,自动离开
-f 强迫打开特殊文件,例如外围设备代号、目录和二进制文件
-i 忽略搜索时的大小写
-m 显示类似 more 命令的百分比
-N 显示每行的行号
-s 显示连续空行为一行

常用操作

符号 描述
/字符串 向下搜索“字符串”的功能
?字符串 向上搜索“字符串”的功能
n 重复前一个搜索(与 / 或 ? 有关)
N 反向重复前一个搜索(与 / 或 ? 有关)
b 向前翻一页
d 向后翻半页
q 退出 less 命令
空格键 向后翻一页
向上键 向上翻动一行
向下键 向下翻动一行

**例一:**显示shiyanlou.log文件中的内容,并显示行号,可以使用如下命令:

less -N shiyanlou.log

**例二:**显示shiyanlou.log文件中的内容,搜索字符串”shiyanlou”,可以使用如下命令:

less shiyanlou.log
/shiyanlou

**例三:**ps 查看进程信息并通过 less 分页显示,可以使用如下命令:

ps -f | less

less 与 cat 和 more 的区别

cat 命令功能:用于显示整个文件的内容,因为单独使用没有翻页功能,所以经常和 more 命令搭配使用,cat 命令还有一个可以将数个文件合并成一个文件的功能。

more 命令功能:让画面在显示满一页时暂停,此时可按空格健继续显示下一个画面,或按 q 键停止显示。

less 命令功能:less 命令的用法与 more 命令类似,也可以用来浏览超过一页的文件。所不同的是 less 命令除了可以按空格键向下显示文件外,还可以利用上下键来滚动文件。当要结束浏览时,只要在 less 命令的提示符“:”下按 q 键即可。

head

主要是用来显示档案的开头至标准输出中,默认 head 命令打印其相应文件的开头 10 行。

命令格式

head [选项] [文件]

常用参数

参数 描述
-q 隐藏文件名
-v 显示文件名
-c<字节> 显示字节数
-n<行数> 显示的行数

常用范例

**例一:**显示shiyanlou.log文件中的前 5 行内容,可以使用如下命令:

head -n 5 shiyanlou.log

**例二:**显示shiyanlou.logzhou.log文件中的前 5 行内容,可以使用如下命令:

head -n 5 shiyanlou.log  zhou.log

tail

tail 命令主要用于显示指定文件末尾内容。常用查看日志文件。

命令格式

tail [选项] [文件]

常用参数

参数 描述
-f 循环读取
-q 不显示处理信息
-v 显示详细的处理信息
-c<字节> 显示的字节数
-n<行数> 显示行数

常用范例

**例一:**显示shiyanlou.log文件中的最后 5 行内容,可以使用如下命令:

tail -n 5 shiyanlou.log

**例二:**显示shiyanlou.log文件中的最后 5 行内容,当shiyanlou.log文件有新内容增加时自动更新显示,可以使用如下命令:

tail -n 5 -f shiyanlou.log

ping www.shiyanlou.com >> shiyanlou.log 这条命令作用是 ping 远程主机,并将信息追加到shyanlou.log文件中。& 的作用是将这条命令放在后台执行,这样shiyanlou.log文件就会一直有内容增加。说明一下,linux 下执行 ping 命令会一直执行,必须手动停止才行。而 windows 下执行 ping 命令时,默认发送四个请求后会自动停止。

which

which 命令的作用是,在 PATH 变量指定的路径中搜索可执行文件的所在位置。它一般用来确认系统中是否安装了指定的软件。

命令格式

which 可执行文件名称

常用范例

**例一:**确认是否安装了 gcc,可以使用如下命令:

which gcc

**例二:**查看 cd 命令的位置路径,可以使用如下命令:

which cd

cd 是 shell 内建命令,而 which 默认是找 PATH 内所指定的目录,内建命令不在其指定的目录中

echo $SHELL 命令可以查看当前使用的 shell

whereis

whereis 命令主要用于定位可执行文件、源代码文件和帮助文件在文件系统中的位置。whereis 命令还具有搜索源代码、指定备用搜索路径和搜索不寻常项的功能。

whereis 命令查找速度非常快,这是因为它根本不是在磁盘中漫无目的乱找,而是在一个数据库中(/var/lib/mlocate/mlocate.db)查询。这个数据库是 Linux 系统自动创建的,包含有本地所有文件的信息,并且每天通过自动执行 updatedb 命令更新一次。也正是因为这个数据库要每天才更新一次,就会使得 whereis 命令的搜索结果有时候会不准确,比如刚添加的文件可能搜不到。

命令格式

whereis [选项] 文件

常用参数

参数 描述
-b 定位可执行文件
-m 定位帮助文件
-s 定位源代码文件
-u 搜索默认路径下除可执行文件、源代码文件和帮助文件以外的其它文件
-B 指定搜索可执行文件的路径
-M 指定搜索帮助文件的路径
-S 指定搜索源代码文件的路径

常用范例

**例一:**搜索 gcc 可执行文件的路径,可以使用如下命令:

whereis -b gcc

**例二:**搜索 gcc 帮助文件的路径,可以使用如下命令:

whereis -m gcc

**例三:**搜索 gcc 源代码的路径,可以使用如下命令:

whereis -s gcc

locate

locate 命令跟 whereis 命令类似,且它们使用的是相同的数据库。但 whereis 命令只能搜索可执行文件、联机帮助文件和源代码文件,如果要获得更全面的搜索结果,可以使用 locate 命令。

locate 命令使用了十分复杂的匹配语法,可以使用特殊字元(如’*’和’?’)来指定需要查找的样本。

命令格式

locate [选项] [搜索字符串]

常用参数

参数 描述
-q 安静模式,不会显示任何错误讯息
-n 至多显示 n 个输出
-r 使用正则表达式做寻找的条件
-V 显示版本信息

常用范例

首先需要安装并更新数据库:

sudo apt-get install locate
sudo updatedb

**例一:**搜索 etc 目录下所有以 sh 开头的文件,可以使用如下命令:

locate /etc/sh

**例二:**搜索 etc 目录下文件名包含 lou 的文件,可以使用如下命令:

locate /etc/*lou*

find命令

find 命令主要作用是沿着文件层次结构向下遍历,匹配符合条件的文件,并执行相应的操作。Linux 下 find 命令提供了相当多的查找条件,功能很强大,对应的学习难度也比较大。

命令格式

find [选项] [搜索路径] [表达式]

默认路径是当前目录,默认表达式为 -print。

表达式可能由下列成份组成:操作符、选项、测试表达式以及动作。

常用参数

参数 描述
-print find 命令将匹配的文件输出到标准输出
-exec find 命令对匹配的文件执行该参数所给出的 shell 命令
-name 按照文件名查找文件
-type 查找某一类型的文件
-prune 使用这一选项可以使 find 命令不在当前指定的目录中查找,如果同时使用 -depth 选项,那么 -prune 将被 find 命令忽略
-user 按照文件属主来查找文件
-group 按照文件所属的组来查找文件
-mtime -n +n 按照文件的更改时间来查找文件,-n 表示文件更改时间距现在小于 n 天,+n 表示文件更改时间距现在大于 n 天,find 命令还有 -atime 和 -ctime 选项

常用范例

**例一:**打印当前目录下的文件目录列表,可以使用如下命令:

find . -print

**例二:**打印当前目录下所有以.txt 结尾的文件名,可以使用如下命令(截图只显示部分):

find . -name "*.txt" -print

-iname 选项跟-name 选项作用一样,不同的地方在于-iname 会忽略字母大小写。

**例三:**打印当前目录下所有以.txt 或.pdf 结尾的文件名,可以使用如下命令(截图只显示部分):

find . \( -name "*.pdf" -or -name "*.txt" \)

例四:打印当前目录下所有不以.txt 结尾的文件名,可以使用如下命令:

find . ! -name "*.txt"

find2

根据文件类型、权限、所有者及操作符来查找匹配文件。

根据文件类型来查找文件,使用 -type 选项,常见 find 文件类型见下表:

Linux_第3张图片

根据文件权限查找文件,使用 -perm 选项。所有者使用 -user 选项。

另外,find 命令可以通过逻辑操作符来创建更复杂的逻辑关系,例如 find 命令(一)中的例三就使用了操作符 -or 。find 命令的逻辑操作符见下表:

Linux_第4张图片

常用范例

**例一:**打印当前目录下所有以 .txt 结尾的符号链接,可以使用如下命令:

find . -type l -name "*.txt" -print

**例二:**打印当前目录下所有权限为 777 的 php 文件(web 服务器上的 php 文件一般需要执行权限),可以使用如下命令:

find . -type f -name "*.php" -perm 777

**例三:**打印当前目录下 root 用户拥有的所有文件,可以使用如下命令:

find . -type f -user root

**例四:**打印当前目录下权限不是 777 和 664 的所有文件,可以使用如下命令:

find . -type f \( ! -perm 777 -and ! -perm 644 \)

find3

使用 find 命令的 -exec 选项来实现对查找到的文件执行指定的动作命令。

常用范例

**例一:**找到当前目录下所有 php 文件,并显示其详细信息,可以使用如下命令:

find . -name "*.php" -exec ls -l {} \;

Linux_第5张图片

-exec 是 find 命令对找到的文件执行的动作,这个动作就是对找到的文件执行命令,上面的命令就是ls -l {}

在这里说明一下{}\;{}其实它就是一个占位符,在 find 命令的执行过程中会不断地替换成当前找到的文件,相当于”ls -l 找到的文件”。

\;是 -exec 命令结束的标记,因为规定 -exec 后面的命令必须以;结束,但;在 shell 中有特殊含义,必须要转义,所以写成\;

**例二:**在实验楼环境中有很多自己编写的 c 语言代码文件,现在想要把所有 c 语言代码文件下载下来,如果一个一个的下载很麻烦,我们可以先查找到所有的 c 语言代码文件,然后将这些文件内容写入到一个文件中,下载这一个文件就可以了,可以使用如下命令:

find . -name "*.c" -exec cat {} \; > all.c

Linux_第6张图片

**例三:**默认下,-exec 后面只能使用单个命令,如果想要多个命令,可以将多个命令写入脚本文件中,然后在 -exec 中使用这个脚本,可以使用如下命令:

find . -name "*.c" -exec ./command.sh {} \;

脚本内容:

#!/bin/bash
ls -l $1       #$1表示第一个参数
cat $1

注意,直接运行上面的代码可能会提示你find './command.sh' : 权限不够,这是因为新建的command.sh没有执行权限,只需要使用chmod +x command.sh给予它可执行权限再执行就可以了。

wc命令

wc 命令是一个统计的工具,主要用来显示文件所包含的行、字和字节数

wc 命令是 word count 的缩写。

命令格式

wc [ 选项 ][文件]

常用参数

参数 描述
-c 统计字节数
-l 统计行数
-m 统计字符数,这个标志不能与 -c 标志一起使用
-w 统计字数,一个字被定义为由空白、跳格或换行字符分隔的字符串
-L 打印最长行的长度

**例一:**统计文件的字节数、行数和字符数,可以使用如下命令:

wc -c c.txt
wc -l c.txt
wc -m c.txt

注意,每行结尾的换行符也算一个字符,空格也算一个字符。另外,由于系统采用 UTF-8 编码,所以一个汉字为 3 字节,9 个汉字加上一个换行,一共 28 个字节。

**例二:**统计文件的字节数、行数和字符数,只打印数字,不打印文件名,可以使用如下命令:

cat c.txt | wc -c
cat c.txt | wc -l
cat c.txt | wc -m

grep 命令

grep 的工作方式是这样的,它在一个或多个文件中搜索字符串模板。

如果模板包括空格,则必须被引用,模板后的所有字符串被看作文件名。搜索的结果被送到标准输出,不影响原文件内容。

grep 可用于 shell 脚本,因为 grep 通过返回一个状态值来说明搜索的状态,如果模板搜索成功,则返回 0,如果搜索不成功,则返回 1,如果搜索的文件不存在,则返回 2。我们利用这些返回值就可进行一些自动化的文本处理工作。

命令格式

grep [选项] pattern [file]

常用参数

参数 描述
-c 计算找到‘搜寻字符串’(即 pattern)的次数
-i 忽略大小写的不同,所以大小写视为相同
-n 输出行号
-v 反向选择,打印不匹配的行
-r 递归搜索
–color=auto 将找到的关键词部分加上颜色显示

正则表达式

正则表达式是一种符号表示法,被用来识别文本模式。

在某种程度上,它们与匹配文件和路径名的 shell 通配符比较相似,但其规模更大。

许多命令行工具和大多数的编程语言都支持正则表达式,以此来帮助解决文本操作问题。

正则表达式元字符由以下字符组成:

^ $ . [ ] { } - ? * + ( ) | \

Linux_第7张图片

常用范例

**例一:**利用 Linux 系统自带的字典查找一个五个字母的单词,第三个字母为 j,最后一个字母为 r,/usr/share/dict目录下存放字典文件(若没有可手动建立),可以使用如下命令:

grep '^..j.r$' words

图片描述

cut 命令

cut 命令是一个将文本按列进行切分的小工具,它可以指定分隔每列的定界符。

如果一行数据包含多个字段(多列),现在想要提取其中的一列或多列,这时 cut 命令就可以大显身手了。

命令格式

cut [选项] [文件名]

常用参数

参数 描述
-b 以字节为单位进行分割
-c 以字符为单位进行分割
-d 自定义分隔符,默认为制表符
-f 自定义字段
–complement 抽取整个文本行,除了那些由 -c 或 -f 选项指定的文本

常用范例

**例一:**取出student.txt文件中的第一列和第三列,可以使用如下命令:

cut -f 1,3 -d ' ' student.txt

Linux_第8张图片

**例二:**取出student.txt文件中的第一列,可以使用如下命令:

cut -f 1 -d ' ' student.txt

**例三:**取出student.txt文件中的前三列,可以使用如下命令:

cut -f 1-3 -d ' ' student.txt

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pDtxwZRC-1630936920680)(https://doc.shiyanlou.com/userid3372labid369time1420779770034)]

**例四:**取出student.txt文件中除第一列的其他列,可以使用如下命令:

cut -f 1 -d ' ' student.txt --complement

Linux_第9张图片

**例五:**给任意一字符串 str,取出其最后一个字符,可以使用如下命令:

num=$(echo -n $str | wc -c)
echo -n $str | cut -b $num
#或者可以使用下面这段代码
echo -n $str | cut -b `echo -n $str | wc -c`

Linux_第10张图片

paste 命令

paste 命令的功能正好与 cut 相反。

它会添加一个或多个文本列到文件中,而不是从文件中抽取文本列。

它通过读取多个文件,然后把每个文件中的字段整合成单个文本流,输入到标准输出。

命令格式

paste [选项] [文件名]

常用参数

参数 描述
-s 将每个文件合并成行而不是按行粘贴
-d 自定义分隔符,默认为制表符

常用范例

**例一:**将student.txttelphone.txt文件中的内容按列拼接,可以使用如下命令:

paste student.txt telphone.txt

Linux_第11张图片

**例二:**将student.txttelphone.txt文件中的内容按列拼接,指定分隔符为:,可以使用如下命令:

paste student.txt telphone.txt -d ':'

Linux_第12张图片

**例三:**将student.txttelphone.txt文件中的内容各自拼接成一行,可以使用如下命令:

paste -s student.txt telphone.txt

Linux_第13张图片

tr 命令

tr 命令常被用来更改字符,我们可以把它看作是一种基于字符的查找和替换操作。

换字是一种把字符从一个字母转换为另一个字母的过程,tr 可以从标准输入中替换、缩减和删除字符,并将结果写到标准输出。

tr 只能通过 stdin(标准输入),而无法通过命令行参数来接受输入。

tr 是 translate(转换)的缩写。

命令格式

tr [选项] SET1 SET2

将来自 stdin 的输入字符从 SET1 映射到 SET2,并将其输出写入 stdout(标准输出)。SET1 和 SET2 是字符类或字符集。如果两个字符集的长度不相等,那么 SET2 会不断重复其最后一个字符,直到长度与 SET1 相同。如果 SET2 的长度大于 SET1,那么在 SET2 中超出 SET1 的那部分字符则全部被忽略。

常用参数

参数 描述
-d 删除匹配 SET1 的内容,并不作替换

常用范例

**例一:**将输入的字符大写转换为小写,可以使用如下命令:

echo 'THIS IS SHIYANLOU!' | tr 'A-Z' 'a-z'

**例二:**将输入的字符中的数字删除,可以使用如下命令:

echo 'THIS 123 IS S1HIY5ANLOU!' | tr -d '0-9'

**例三:**tr 命令的一个有趣的用法是执行 ROT13 文本编码。ROT13 是一款微不足道的基于一种简易的替换暗码的加密类型。把 ROT13 称为“加密”是不严格的,“文本模糊处理”更准确些。有时候它被用来隐藏文本中潜在的攻击内容。这个方法就是简单地把每个字符在字母表中向前移动 13 位。因为移动的位数是所有 26 个字母的一半,所以对文本再次执行这个算法,就恢复到了它最初的形式。可以使用如下命令:

#加密
echo 'shiyanlou' | tr 'a-zA-Z' 'n-za-mN-ZA-M'

得到结果 fuvlnaybh

#解密
echo 'fuvlnaybh' | tr  'a-zA-Z'  'n-za-mN-ZA-M'

得到结果 shiyanlou

Linux_第14张图片

用户管理

关机&重启命令

shutdown

shutdown -h now 立即关机
shutdown -h 1  一分钟后关机
shutddown -r now 立即重启

halt :关机

reboot :重启系统

sync :将内存上的数据写入磁盘(建议重启或关机前使用)

logout :注销用户(图形界面无效)

注意:不管是重启系统还是关闭系统,首先要运行sync命令,把内存中的数据写到磁盘中

说明

  1. Linux 系统是一个多用户多任务的操作系统,任何一个要使用系统资源的用户,都必须首先向系统管理员申请一个账号,然后以这个账号的身份进入系统。

  2. Linux 的用户需要至少要属于一个组

用户

添加用户

基本语法

useradd  [选项]  用户名
adduser  用户名

特别说明:

  • cd 表示 change directory, 切换目录.
  1. 当创建用户成功后,会自动的创建和用户同名的家目录
  2. 也可以通过 useradd -d 指定目录 新的用户名,给新创建的用户指定家目录

useradd命令的选项

-c comment 用户的注释性信息
-d home_dir 指定用户的主目录
-e expire_date 禁用帐号的日期,格式为:YYYY-MM-DD
-f inactive_days 设置帐户过期多少天后,用户帐户被禁用。
-u UID 指定用户的UID
-g initial_group 用户所属主组群的组群名称或者GID
-G group-list 用户所属的附属组群列表
-m 若用户主目录不存在则创建它
-M 不要创建用户主目录
-n 不要为用户创建用户私人组群
-p passwd 加密的口令
-r 创建UID小于500的不带主目录的系统帐号
-s shell 指定用户的登录Shell,默认为/bin/bash

在 /home 目录下查看工作目录:

ls /home

切换登录用户:

su -l lilei

退出当前用户:

可以使用 exit 命令或者使用快捷键 Ctrl+D。

查看用户

who am i

# 或者

who mom likes

who 命令其它常用参数

参数 说明
-a 打印能打印的全部
-d 打印死掉的进程
-m am imom likes
-q 打印当前登录用户数及用户名
-u 打印当前登录用户登录信息
-r 打印运行等级

给用户指定或者修改密码

基本语法

passwd 用户名

passwd命令的选项

-l 锁定(停用)用户帐户
-u 口令解锁
-d 将用户口令设置为空,这与未设置口令的帐户不同。未设置口令的帐户无法登录系统,而口令为空的帐户可以。
-f 强迫用户下次登录时必须修改口令
-n 指定口令的最短存活期
-x 指定口令的最长存活期
-w 口令要到期前提前警告的天数
-I 口令过期后多少天停用帐户
-S 显示帐户口令的简短状态信息

修改用户帐户

chage  [选项] 〈username〉

选项:

-l 列出帐户口令属性的各个数值
-m 指定口令最短存活期
-M 指定口令最长存活期
-W 口令要到期前提前警告的天数
-I 口令过期后多少天停用帐户
-E 用户帐户到期作废的日期
-d 设置口令上一次修改的日期

删除用户

基本语法

userdel   用户名

应用案例

删除用户 xm,但是要保留家目录 image-20200927234203725

删除用户 xh 以及用户主目录 image-20200927234233118

  • 在删除用户时,我们一般不会将家目录删除

查询用户信息

基本语法

id  用户名

Linux_第15张图片

  • 当用户不存在时,返回”无此用户”

切换用户

在操作 Linux 中,如果当前用户的权限不够,可以通过 su - 指令,切换到高权限用户,比如 root

su	–切换用户名
  • 从权限高的用户切换到权限低的用户,不需要输入密码,反之需要。

  • 当需要返回到原来用户时,使用 exit 指令

用户组

用户和组群的基本概念

用户名 用来标识用户的名称,可以是字母、数字组成的字符串,区分大小写
密码 用于验证用户身份的特殊验证码
用户标识(UID) 用来表示用户的数字标识符
用户主目录 用户的私人目录,也是用户登录系统后默认所在的目录
登录Shell 用户登录后默认使用的Shell程序,默认为/bin/bash
组群 具有相同属性的用户属于同一个组群
组群标识(GID) 用来表示组群的数字标识符

用户和组群概述

每一个用户都有一个唯一的身份标识,称为用户ID(UID);每一个用户组也有一个唯一的身份标识,称为用户组ID(GID)。
root用户的UID为0。
普通用户的UID可以在创建时由管理员指定,如果不指定,用户的UID默认从500开始顺序编号。

用户和组群配置文件

用户帐户文件:
/etc/passwd文件:用户帐户信息
/etc/shadow文件:用户口令
组群文件: 
/etc/group文件:组群帐户信息
/etc/gshadow文件:组群口令、管理员等管理信息
/etc/login.defs文件

类似于角色,系统可以对有共性的多个用户进行统一的管理

增加组
groupadd 组名
增加用户时直接加上组

指令(基本语法)

useradd	-g 用户组 用户名
修改用户的组

指令(基本语法)

usermod	-g 用户组 用户名

禁用和恢复用户帐户

Passwd命令

禁用user1帐户

image-20201209211150321

查看(被锁定的用户密码栏前面会加上!)

image-20201209211201883

恢复user1帐户(解除锁定)

image-20201209211217079

Usermod命令

禁用user1帐户

image-20201209211343866

解除user1用户锁定

image-20201209211351722

Linux_第16张图片

直接修改配置文件

可将/etc/passwd文件或/etc/shadow文件中关于user1帐户的passwd域的第一个字符前面加上一个“”,达到禁用

帐户的目的,在需要恢复的时候只要删除字符“”即可。

如果只是禁止用户帐户登录系统,可以将其启动Shell设置为/bin/false或者/dev/null。

/etc/passwd 文件

用户(user)的配置文件,记录用户的各种信息

每行的含义:用户名:口令:用户标识号:组标识号:注释性描述:主目录:登录 Shell

Linux_第17张图片

/etc/shadow 文件

所有用户对passwd文件均可读取,只有root用户对shadow文件可读,因此密码存放在shadow文件中更安全

口令的配置文件

每行的含义:登录名:加密口令:最后一次修改时间:最小时间间隔:最大时间间隔:警告时间:不活动时间:失效时间:标志

/etc/group 文件

用户的组账户的信息存放在group文件中,任何用户都可以读取,用“:”分隔为4个域。

组(group)的配置文件,记录 Linux 包含的组的信息

每行含义:组名:口令:组标识号:组内用户列表

image-20201021095039595

/etc/gshadow文件

gshadow文件用于存放组群的加密口令、组管理员等信息,只有root用户可读,用“:”分隔成4个域

/etc/login.defs文件

建立用户帐户时根据/etc/login.defs文件的配置设置用户帐户的某些选项。

文件权限

查看文件权限

Vim

命令模式

​ 启动Vim默认进入命令模式。此时界面不能编辑,只能接受命令(键入的命令看不到)
​ 文件的保存,退出,文本的删除、复制、搜索等操作

输入模式

​ 编辑模式

​ 命令模式下用i(sert),a(ppend),o,s等均可进入该模式。按esc返回命令模式

行编辑模式

​ 实际上也是命令模式的一种,在命令模式下输入冒号进入一个命令行,可显示地输入命令(所以也有些书认为是两种工作模式)。

vim的启动

启动命令:vim my.txt
如果文件存在,则vim显示文件内容并等待用户的命令。
如果指定的文件不存在,则vim将告知用户这是未命名的文件,并进入一个空白的界面。
启动vim时都是默认处于命令模式。
用户必须使用命令切换到文本输入模式才能进行输入编辑,或者可执行删除、复制等编辑命令。

vim的退出

冒号进命令行模式下:

不存档强制退出

:q!  

保存但不退出,w(rite)后可加所要存档的文档名

:w 

存档后退出

:wq 
命令模式下按zz,功能与:wq相同。
	:x  与  :wq 相同

命令模式

ZZ、ZQ  保存/不保存退出

插入模式下的编辑模式

必须从命令模式转入插入模式才能进行输入编辑,可用命令有:

新增(append)

a:从光标所在位置后面开始新增资料
A:从光标所在行最后面的地方开始新增资料。

插入(insert)

i:从光标所在位置前面开始插入资料
I:从光标所在行的第一个非空白字元前面开始插入资料。

开始(open)

o:在光标所在行下新增一列并进入输入模式。
O:在光标所在行上方新增一列并进入输入模式

冒号进入行命令模式,输入

显示行号

set nu

命令模式下的编辑模式

删除

删除光标所在字符

x

删除一个单词

dw

删除光标所在的行

dd

删除光标所在字节,并进入输入模式

s

表示数字

#

删除几个字符,如3x

#x

删除几个单词,如3dw表示删除三个单词

#dw

删除多个行,如3dd表示删除光标行及光标的下两行

#dd 

删除光标到行尾的内容

d$

d光标键

​ 左:删除光标前面的字符;

​ 右:删除光标所在的字符;

​ 上:将当前行与上一行删除;

​ 下:当前行与下一行删除

nd上下光标键

​ 删除当前行之上、下的几行
​ 文本(包括当前行)

u、U恢复键

恢复刚才被修改的文本

u

恢复光标所在行的所有修改

U:
.:重复上一次命令的操作

复制

复制命令

y

复制整行

yy

复制光标所在的单词

yw

复制包括光标所在的n个单词

nyw

复制包括当前行在内的n行

nyy

粘贴命令

P

光标移动

h、j、k、1
nG:移动到底n行行首

行命令模式下的操作

字符串的查找、替换

搜索指定的字符串

:/string

继续进行搜索

按键n
如果写的是斜杠(/):按n会从当前位置向后查我;如果写的是问号(?),按n键则从当前位置向前查找

查找且替换

:%s

:%s/SEARCH/REPLACE把文档中所有SEARCH替换成REPLACE;
:#

:#,#s/SEARCH/REPLACE/g
#号表示数字,表示从多少行到多少行,把SEARCH替换成REPLACE;
:s

:s/SEARCH/REPLACE/g把当前光标所在行中的SEARCH单词,替换成REPLACE,并把所有SEARCH高亮显示

Vim 查找目标文本

快捷键 功能描述
/abc 从光标所在位置向前查找字符串 abc
/^abc 查找以 abc 为行首的行
/abc$ 查找以 abc 为行尾的行
?abc 从光标所在为主向后查找字符串 abc
n 向同一方向重复上次的查找指令
N 向相反方向重复上次的查找指定

Vim替换文本

快捷键 功能描述
r 替换光标所在位置的字符
R 从光标所在位置开始替换字符,其输入内容会覆盖掉后面等长的文本内容,按“Esc”可以结束
/a1/a2/g 将当前光标所在行中的所有 a1 用 a2 替换
:n1,n2s/a1/a2/g 将文件中 n1 到 n2 行中所有 a1 都用 a2 替换
:g/a1/a2/g 将文件中所有的 a1 都用 a2 替换

显示行号

set nu

显示光标位置

set ruler

显示光标位置

set undolevel

智能缩进

set smartindent

语法高亮

syntax on(或syn on)

Linux_第18张图片

Shell

shell的基本元素

1.#!/bin/bash 必须的,指出shell的类型

2.# 注释

3.变量

4.控制

一般步骤

(1)编辑文件

(2)保存文件

(3)将文件赋予可执行的权限

(4)运行及排错

执行方式

一般以.sh为文件后缀。没有也能执行。
常见的两种执行方式

./文件名

在当前目录下写明路径执行,要求文件必须有执行权限,如
	chmod 755 run.sh    //赋予它执行权限
	./run.sh 

sh文件名

sh run.sh

文件开头指定一个或多个解释脚本程序的she11,如

#!/bin/bash 

如果指定,注意/bin不要漏了“/”,否则用./方式执行会找不到路径。
不指定的话一般默认以/bin/sh执行she11脚本

特殊字符

1、注释符#

除了#!/bin/bash里的#特殊

2、美元符 $

变量符。
与反斜杠转义符相反,使其后的普通字符作为变量名,如$a表示变量a的值。
变量字符长度超过1个时,用{}括起来

3、单引号
被引起的字符全部做普通字符,即全部原样

name=hello
echo 'my $name'
输出:my $name

4、双引号
引号内的内容,除$、转义符\ 、倒引号``这三个保留特殊功能,其他字符均做普通字符。

name=hello
echo "my $name"
输出:my hello

5、倒引号(数字1键旁边的那个键)``

引号内的字符串当做shell命令行解释执行,得到的结果取代整个倒引号括起来的部分。

echo 'pwd'
即得pwd命令的执行结果
例如:/root

6.反斜线
反斜线是转义字符,它能把特殊字符变成普通字符。在某个字符前面利用反斜杠(\)能够阻止shell把后面的字符解释为特殊字符。

echo "my home is \$HOME"
输出:my home is $HOME

注意:在单引号括起来的字符串中,反斜线也成为普通字符,而失去转义字符功能。

Shell变量

介绍

1)Linux Shell 中的变量分为,系统变量和用户自定义变量

2)系统变量:$ HOME、$ PWD、$ SHELL、$ USER 等等

定义变量:变量=值

撤销变量:unset 变量

声明静态变量:readonly 变量,注意:不能 unset

案例 1:定义变量 A,然后撤销变量 A

Linux_第19张图片

输出:
hellp world!
A=100
A=

案例 2:显示当前 shell 中所有变量:set

set |more

定义变量的规则

  1. 变量名称可以由字母、数字和下划线组成,但是不能以数字开头。

  2. 等号两侧不能有空格,可以使用下划线(_)

  3. 变量名称一般习惯为大写

  4. 不能使用标点符号。

  5. 不能使用bash里的关键字(可用help命令查看保留关键字)

将命令的返回值赋值给变量(重点)

也就是在shell文件里使用终端的命令,并将命令返回的字符串返回给变量。

方法:
1A=`ls -la` 反引号,运行里面的命令,并把结果返回给变量A
2A=$(ls -la) 等价于反引号

注意:反引号在键盘esc键的下面,一般我们习惯使用上述第二种方式赋值。

案例:

Linux_第20张图片

将ls -l /home 命令的返回值赋给了LS变量,date命令赋值给了MY_DATE变量,然后输出。

变量

使用变量

使用一个定义过的变量,只要在变量名前面加美元符号即可,如:

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

输出:
qinjx
qinjx
只读变量

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

下面的例子尝试更改只读变量,结果报错:

#!/bin/bash
myUrl="https://www.google.com"
readonly myUrl
myUrl="https://www.runoob.com"

运行脚本,结果如下:

/bin/sh: NAME: This variable is read only.
删除变量

使用 unset 命令可以删除变量。语法:

unset variable_name

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

实例

#!/bin/sh
myUrl="https://www.runoob.com"
unset myUrl
echo $myUrl

以上实例执行将没有任何输出

设置环境变量
  1. export 变量名=变量值 (功能描述:将 shell 变量输出为环境变量)
  2. source 配置文件(功能描述:让修改后的配置信息立即生效

Linux里将环境变量存放在/etc/profile文件里

案例:设置tomcat的环境变量

内部变量

内部变量是Linux所提供的一种特殊类型的变量,这类变量在程序中用来作出判断。在shell程序内这类变量的值是不能修改的。

部分内部变量是:

$# 	——传送给shell程序的位置参数的数量

$? 	——最后命令的完成码或者在shell程序内部执行的shell程序(返回值)

$0 	——shell程序的名称

$* 	——调用shell程序时所传送的全部参数的单字符串, “参数1”“参数2”…形式保存的参数

$@ 	--“参数1”“参数2”…形式保存的参数

$n	 第n个参数

$$ 	本程序的PID

$! 	上一个命令的PID

shift	移动参数
预定义变量

就是 shell 设计者事先已经定义好的变量,可以直接在 shell 脚本中使用
语法:

  • $$ :当前进程的进程号(PID)
  • $! :后台运行的最后一个进程的进程号(PID)
  • $?:最后一次执行的命令的返回状态。0表示成功,非0表示不成功。

案例:
创建preVar.sh文件,在第二行进行后台执行position.sh(在命令后面加&),最后返回成功执行状态

Linux_第21张图片

Linux_第22张图片

Shell 基本运算符

Shell 和其他编程语言一样,支持多种运算符,包括:

  • 算数运算符
  • 关系运算符
  • 布尔运算符
  • 字符串运算符
  • 文件测试运算符

原生bash不支持简单的数学运算,但是可以通过其他命令来实现,例如 awk 和 expr,expr 最常用。

expr 是一款表达式计算工具,使用它能完成表达式的求值操作。

例如,两个数相加(注意使用的是反引号 *\** 而不是单引号 \***)

#!/bin/bash

val=`expr 2 + 2`
echo "两数之和为 : $val"

结果:两数之和为 : 4

注意:

  • 表达式和运算符之间要有空格,例如 2+2 是不对的,必须写成 2 + 2,这与我们熟悉的大多数编程语言不一样。
  • 完整的表达式要被 包含,注意这个字符不是常用的单引号,在 Esc 键下边。
算术运算符

下表列出了常用的算术运算符,假定变量 a 为 10,变量 b 为 20:

运算符 说明 举例
+ 加法 expr $a + $b 结果为 30。
- 减法 expr $a - $b 结果为 -10。
* 乘法 expr $a \* $b 结果为 200。
/ 除法 expr $b / $a 结果为 2。
% 取余 expr $b % $a 结果为 0。
= 赋值 a=$b 将把变量 b 的值赋给 a。
== 相等。用于比较两个数字,相同则返回 true。 [ $a == $b ] 返回 false。
!= 不相等。用于比较两个数字,不相同则返回 true。 [ $a != $b ] 返回 true。

注意:

  • 条件表达式要放在方括号之间,并且要有空格,例如: [ a = = a== a==b] 是错误的,

    必须写成 [ $a == $b ]

  • 乘号(*)前边必须加反斜杠()才能实现乘法运算;

关系运算符

关系运算符只支持数字,不支持字符串,除非字符串的值是数字。

下表列出了常用的关系运算符,假定变量 a 为 10,变量 b 为 20:

运算符 说明 举例
-eq 检测两个数是否相等,相等返回 true。 [ $a -eq $b] 等于
-ne 检测两个数是否不相等,不相等返回 true。 [$a -ne $b ] 不等于
-gt 检测左边的数是否大于右边的,如果是,则返回 true。 [ $a -gt $b ] 大于
-lt 检测左边的数是否小于右边的,如果是,则返回 true。 [$a -lt $b ] 小于
-ge 检测左边的数是否大于等于右边的,如果是,则返回 true。 [ $a -ge $b] 大于等于
-le 检测左边的数是否小于等于右边的,如果是,则返回 true。 [ $a -le $b ] 小于等于
布尔运算符

下表列出了常用的布尔运算符,假定变量 a 为 10,变量 b 为 20:

运算符 说明 举例
! 非运算,表达式为 true 则返回 false,否则返回 true。 [ ! false ] 返回 true。
-o 或运算,有一个表达式为 true 则返回 true。 [ $a -lt 20 -o $b -gt 100 ] 返回 true。
-a 与运算,两个表达式都为 true 才返回 true。 [ $a -lt 20 -a $b -gt 100 ] 返回 false。
逻辑运算符

以下介绍 Shell 的逻辑运算符,假定变量 a 为 10,变量 b 为 20:

运算符 说明 举例
&& 逻辑的 AND [[ $a -lt 100 && $b -gt 100]] 返回 false
|| 逻辑的 OR [[ $a -lt 100 || $b -gt 100 ]] 返回 true

字符串运算符

下表列出了常用的字符串运算符,假定变量 a 为 “abc”,变量 b 为 “efg”:

运算符 说明 举例
= 检测两个字符串是否相等,相等返回 true。 [ $a = $b ] 返回 false。
!= 检测两个字符串是否相等,不相等返回 true。 [ $a != $b ] 返回 true。
-z 检测字符串长度是否为0,为0返回 true。 [ -z $a ] 返回 false。
-n 检测字符串长度是否不为 0,不为 0 返回 true。 [ -n “$a” ] 返回 true。
$ 检测字符串是否为空,不为空返回 true。 [ $a ] 返回 true。
文件测试运算符

文件测试运算符用于检测 Unix 文件的各种属性。

属性检测描述如下:

操作符 说明 举例
-b file 检测文件是否是块设备文件,如果是,则返回 true。 [ -b $file ] 返回 false。
-c file 检测文件是否是字符设备文件,如果是,则返回 true。 [ -c $file ] 返回 false。
-d file 检测文件是否是目录,如果是,则返回 true。 [ -d $file ] 返回 false。
-f file 检测文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回 true。 [ -f $file ] 返回 true。
-g file 检测文件是否设置了 SGID 位,如果是,则返回 true。 [ -g $file ] 返回 false。
-k file 检测文件是否设置了粘着位(Sticky Bit),如果是,则返回 true。 [ -k $file ] 返回 false。
-p file 检测文件是否是有名管道,如果是,则返回 true。 [ -p $file ] 返回 false。
-u file 检测文件是否设置了 SUID 位,如果是,则返回 true。 [ -u $file ] 返回 false。
-r file 检测文件是否可读,如果是,则返回 true。 [ -r $file ] 返回 true。
-w file 检测文件是否可写,如果是,则返回 true。 [ -w $file ] 返回 true。
-x file 检测文件是否可执行,如果是,则返回 true。 [ -x $file ] 返回 true。
-s file 检测文件是否为空(文件大小是否大于0),不为空返回 true。 [ -s $file ] 返回 true。
-e file 检测文件(包括目录)是否存在,如果是,则返回 true。 [ -e $file ] 返回 true。

其他检查符:

  • -S: 判断某文件是否 socket。
  • -L: 检测文件是否存在并且是一个符号链接。

条件判断

语法:
[ condition ](注意 condition 前后要有空格)
非空返回 true,可使用$?验证(0 为 true,>1 为 false)

常用判断条件

  1. 两个整数的比较

     =  字符串比较
    -lt 小 于
    -le 小于等于
    -eq 等 于
    -gt 大 于
    -ge 大于等于
    -ne 不等于
    
  2. 按照文件权限进行判断

    -r 	有读的权限 [ -r 文件 ]
    -w 	有写的权限
    -x 	有执行的权限
    
  3. 按照文件类型进行判断

    -f 文件存在并且是一个常规的文件
    -e 文件存在
    -d 文件存在并是一个目录
    

案例:

  1. “ok"是否等于"ok”
  2. 23是否大于22

Linux_第23张图片

结果:

equal
大于

​ 4.aaa.txt文件是否存在

​ 5.aaa.txt文件是否有读写权限

Linux_第24张图片

Linux_第25张图片

流程控制

if判断

语法

  1. if [ 条件判断式 ];then
    程序
    fi
    
  2. if [ 条件判断式 ]
    then
    程序
    elif [ 条件判断式 ]
    then
    程序
    fi
    
  3. if [ 条件判断式 ]
    then
    程序
    else [ 条件判断式 ]
    then
    程序
    fi
    

注意:中括号与条件判断式之间必须要有空格

案例:判断输入参数大于等于80优秀,大于等于60及格,否则不及格

Linux_第26张图片

在这里插入图片描述

case语句

语法:

case $变量名 in
“值 1”)
如果变量的值等于值 1,则执行程序 1
;;
“值 2”)
如果变量的值等于值 2,则执行程序 2
;;
…省略其他分支…
*)
如果变量的值都不是以上的值,则执行此程序
;;
esac

案例:当命令行参数是 1 时,输出 “周一”, 是 2 时,就输出"周二", 其它情况输出 “其他”

Linux_第27张图片

Linux_第28张图片

for循环

有两种形式

for 变 量 in123do
程序
done

案例1:打印命令行参数

Linux_第29张图片

Linux_第30张图片

for (( 初始值;循环控制条件;变量变化 ))
do
程序
done
案例2:1到100累加并输出

Linux_第31张图片

在这里插入图片描述

while循环

语法

while [ 条件判断式 ]
do
程序
done

案例:命令行输入一个数n,计算1+…+n的值

Linux_第32张图片

在这里插入图片描述

read读取控制台
read(选项)(参数)

选项:

  • -p:指定读取值时的提示符;
  • -t:指定读取值时等待的时间(秒),如果没有在指定的时间内输入,就不再等待了

参数变量:指定读取值的变量名

案例:

​ 1.读取控制台输入一个 num 值

​ 2.读取控制台输入一个 num 值,在 10 秒内输入。

Linux_第33张图片

测试案例2时第一次十秒内未输入,第二次输入

Linux_第34张图片

函数

shell 编程和其它编程语言一样,有系统函数,也可以自定义函数。这里介绍两个系统函数。

两个系统函数
  • basename
    功能:返回完整路径后面的部分,常用于获取路径名
    语法:

    basename[路径名][后缀]
    

注意:basename 命令会删掉所有的前缀包括最后一个(‘/’)字符,然后将字符串显示出来,如果

选项带有后缀,返回值将会把后缀删掉

案例:

在这里插入图片描述

  • dirname
    功能描述:从给定的包含绝对路径的文件名中去除文件名(非目录的部分),然后返回剩下的

    路径(目录的部分)

案例:

在这里插入图片描述

自定义函数

语法:

[ function ] funname[()]
{
Action;
[return int;]
}

案例:就是输入的两个数之和

Linux_第35张图片

n/20200518214739879.png)

在这里插入图片描述

case语句

语法:

case $变量名 in
“值 1”)
如果变量的值等于值 1,则执行程序 1
;;
“值 2”)
如果变量的值等于值 2,则执行程序 2
;;
…省略其他分支…
*)
如果变量的值都不是以上的值,则执行此程序
;;
esac

案例:当命令行参数是 1 时,输出 “周一”, 是 2 时,就输出"周二", 其它情况输出 “其他”

Linux_第36张图片

Linux_第37张图片

for循环

有两种形式

for 变 量 in123do
程序
done

案例1:打印命令行参数

Linux_第38张图片

Linux_第39张图片

for (( 初始值;循环控制条件;变量变化 ))
do
程序
done
案例2:1到100累加并输出

Linux_第40张图片

在这里插入图片描述

while循环

语法

while [ 条件判断式 ]
do
程序
done

案例:命令行输入一个数n,计算1+…+n的值

Linux_第41张图片

在这里插入图片描述

read读取控制台
read(选项)(参数)

选项:

  • -p:指定读取值时的提示符;
  • -t:指定读取值时等待的时间(秒),如果没有在指定的时间内输入,就不再等待了

参数变量:指定读取值的变量名

案例:

​ 1.读取控制台输入一个 num 值

​ 2.读取控制台输入一个 num 值,在 10 秒内输入。

Linux_第42张图片

测试案例2时第一次十秒内未输入,第二次输入

Linux_第43张图片

函数

shell 编程和其它编程语言一样,有系统函数,也可以自定义函数。这里介绍两个系统函数。

两个系统函数
  • basename
    功能:返回完整路径后面的部分,常用于获取路径名
    语法:

    basename[路径名][后缀]
    

注意:basename 命令会删掉所有的前缀包括最后一个(‘/’)字符,然后将字符串显示出来,如果

选项带有后缀,返回值将会把后缀删掉

案例:

在这里插入图片描述

  • dirname
    功能描述:从给定的包含绝对路径的文件名中去除文件名(非目录的部分),然后返回剩下的

    路径(目录的部分)

案例:

在这里插入图片描述

自定义函数

语法:

[ function ] funname[()]
{
Action;
[return int;]
}

案例:就是输入的两个数之和

Linux_第44张图片

在这里插入图片描述

你可能感兴趣的:(学习,linux)