在 Linux 操作系统中,所有的文件和目录都被组织成以一个根节点“/”开始的倒置的树状结构
绝对路径:
路径的写法,由根目录 / 写起,例如: /usr/share/doc 这个目录。
相对路径:
相对路径不是从根目录 / 开始写起,而是从当前所在的工作目录开始写起。,例如由 /usr/share/doc 要到 /usr/share/man 底下时,可以写成: cd …/man 这就是相对路径的写法。
Linux 命令的基本格式:
[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+d |
键盘输入结束或退出终端 |
Ctrl+s |
暂停当前程序,暂停后按下任意键恢复运行 |
Ctrl+z |
将当前程序放到后台运行,恢复到前台为命令fg |
Ctrl+a |
将光标移至输入行头,相当于Home 键 |
Ctrl+e |
将光标移至输入行末,相当于End 键 |
Ctrl+k |
删除从光标所在位置到行末 |
Alt+Backspace |
向前删除一个单词 |
Shift+PgUp |
将终端显示向上滚动 |
Shift+PgDn |
将终端显示向下滚动 |
字符 | 含义 |
---|---|
* |
匹配 0 或多个字符 |
? |
匹配任意一个字符 |
[list] |
匹配 list 中的任意单一字符 |
[^list] |
匹配 除 list 中的任意单一字符以外的字符 |
[c1-c2] |
匹配 c1-c2 中的任意单一字符 如:[0-9][a-z] |
{string1,string2,...} |
匹配 string1 或 string2 (或更多)其一字符串 |
{c1..c2} |
匹配 c1-c2 中全部字符 如{1…10} |
命令可以是下面四种形式之一:
/usr/bin
中的文件一样。属于这一类的程序,可以编译成二进制文件,诸如用 C 和 C++ 语言写成的程序,也可以是由脚本语言写成的程序,比如说 shell,perl,python,ruby,等等。在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是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 命令是 Print Working Directory 的缩写。
命令格式
pwd [选项]
常用参数
参数 | 描述 |
---|---|
-P | 显示实际物理路径,而非使用连接(link)路径 |
-L | 当目录为连接路径时,显示连接路径 |
**例一:**显示当前目录所在路径,可以使用如下命令:
pwd
**例二:**显示当前目录的物理路径,可以使用如下命令:
pwd -P
**例三:**显示当前目录的连接路径,可以使用如下命令:
pwd -L
mkdir 命令用来创建指定名称的目录,要求创建目录的用户在当前目录中具有写权限,并且指定的目录名不能是当前目录中已有的目录。
mkdir 命令是 make directory 的缩写。
命令格式
mkdir [选项] 目录
常用参数
参数 | 描述 |
---|---|
-m --mode=模式 | 设定权限<模式> |
-p --parents | 可以是一个路径名称。若路径中的某些目录尚不存在,加上此选项后,系统将自动建立好那些尚不存在的目录,即一次可以建立多个目录 |
-v --verbose | 每次创建新目录都显示信息 |
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 命令是 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 命令用来复制文件或者目录。
一般情况下,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 命令是 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 命令在 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 命令,功能类似 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 命令也是对文件或其它输出进行分页显示的工具,应该说是 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
cat 命令功能:用于显示整个文件的内容,因为单独使用没有翻页功能,所以经常和 more 命令搭配使用,cat 命令还有一个可以将数个文件合并成一个文件的功能。
more 命令功能:让画面在显示满一页时暂停,此时可按空格健继续显示下一个画面,或按 q 键停止显示。
less 命令功能:less 命令的用法与 more 命令类似,也可以用来浏览超过一页的文件。所不同的是 less 命令除了可以按空格键向下显示文件外,还可以利用上下键来滚动文件。当要结束浏览时,只要在 less 命令的提示符“:”下按 q 键即可。
主要是用来显示档案的开头至标准输出中,默认 head 命令打印其相应文件的开头 10 行。
命令格式
head [选项] [文件]
常用参数
参数 | 描述 |
---|---|
-q | 隐藏文件名 |
-v | 显示文件名 |
-c<字节> | 显示字节数 |
-n<行数> | 显示的行数 |
常用范例
**例一:**显示shiyanlou.log
文件中的前 5 行内容,可以使用如下命令:
head -n 5 shiyanlou.log
**例二:**显示shiyanlou.log
和zhou.log
文件中的前 5 行内容,可以使用如下命令:
head -n 5 shiyanlou.log zhou.log
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 命令的作用是,在 PATH 变量指定的路径中搜索可执行文件的所在位置。它一般用来确认系统中是否安装了指定的软件。
命令格式
which 可执行文件名称
常用范例
**例一:**确认是否安装了 gcc,可以使用如下命令:
which gcc
**例二:**查看 cd 命令的位置路径,可以使用如下命令:
which cd
cd 是 shell 内建命令,而 which 默认是找 PATH 内所指定的目录,内建命令不在其指定的目录中
echo $SHELL
命令可以查看当前使用的 shell
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 命令跟 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 命令主要作用是沿着文件层次结构向下遍历,匹配符合条件的文件,并执行相应的操作。Linux 下 find 命令提供了相当多的查找条件,功能很强大,对应的学习难度也比较大。
命令格式
find [选项] [搜索路径] [表达式]
默认路径是当前目录,默认表达式为 -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 文件类型见下表:
根据文件权限查找文件,使用 -perm 选项。所有者使用 -user 选项。
另外,find 命令可以通过逻辑操作符来创建更复杂的逻辑关系,例如 find 命令(一)中的例三就使用了操作符 -or 。find 命令的逻辑操作符见下表:
常用范例
**例一:**打印当前目录下所有以 .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 {} \;
-exec 是 find 命令对找到的文件执行的动作,这个动作就是对找到的文件执行命令,上面的命令就是ls -l {}
。
在这里说明一下{}
和\;
,{}
其实它就是一个占位符,在 find 命令的执行过程中会不断地替换成当前找到的文件,相当于”ls -l 找到的文件”。
而\;
是 -exec 命令结束的标记,因为规定 -exec 后面的命令必须以;
结束,但;
在 shell 中有特殊含义,必须要转义,所以写成\;
。
**例二:**在实验楼环境中有很多自己编写的 c 语言代码文件,现在想要把所有 c 语言代码文件下载下来,如果一个一个的下载很麻烦,我们可以先查找到所有的 c 语言代码文件,然后将这些文件内容写入到一个文件中,下载这一个文件就可以了,可以使用如下命令:
find . -name "*.c" -exec cat {} \; > all.c
**例三:**默认下,-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 命令是 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 可用于 shell 脚本,因为 grep 通过返回一个状态值来说明搜索的状态,如果模板搜索成功,则返回 0,如果搜索不成功,则返回 1,如果搜索的文件不存在,则返回 2。我们利用这些返回值就可进行一些自动化的文本处理工作。
命令格式
grep [选项] pattern [file]
常用参数
参数 | 描述 |
---|---|
-c | 计算找到‘搜寻字符串’(即 pattern)的次数 |
-i | 忽略大小写的不同,所以大小写视为相同 |
-n | 输出行号 |
-v | 反向选择,打印不匹配的行 |
-r | 递归搜索 |
–color=auto | 将找到的关键词部分加上颜色显示 |
正则表达式是一种符号表示法,被用来识别文本模式。
在某种程度上,它们与匹配文件和路径名的 shell 通配符比较相似,但其规模更大。
许多命令行工具和大多数的编程语言都支持正则表达式,以此来帮助解决文本操作问题。
正则表达式元字符由以下字符组成:
^ $ . [ ] { } - ? * + ( ) | \
常用范例
**例一:**利用 Linux 系统自带的字典查找一个五个字母的单词,第三个字母为 j,最后一个字母为 r,/usr/share/dict
目录下存放字典文件(若没有可手动建立),可以使用如下命令:
grep '^..j.r$' words
cut 命令是一个将文本按列进行切分的小工具,它可以指定分隔每列的定界符。
如果一行数据包含多个字段(多列),现在想要提取其中的一列或多列,这时 cut 命令就可以大显身手了。
命令格式
cut [选项] [文件名]
常用参数
参数 | 描述 |
---|---|
-b | 以字节为单位进行分割 |
-c | 以字符为单位进行分割 |
-d | 自定义分隔符,默认为制表符 |
-f | 自定义字段 |
–complement | 抽取整个文本行,除了那些由 -c 或 -f 选项指定的文本 |
常用范例
**例一:**取出student.txt
文件中的第一列和第三列,可以使用如下命令:
cut -f 1,3 -d ' ' student.txt
**例二:**取出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
**例五:**给任意一字符串 str,取出其最后一个字符,可以使用如下命令:
num=$(echo -n $str | wc -c)
echo -n $str | cut -b $num
#或者可以使用下面这段代码
echo -n $str | cut -b `echo -n $str | wc -c`
paste 命令的功能正好与 cut 相反。
它会添加一个或多个文本列到文件中,而不是从文件中抽取文本列。
它通过读取多个文件,然后把每个文件中的字段整合成单个文本流,输入到标准输出。
命令格式
paste [选项] [文件名]
常用参数
参数 | 描述 |
---|---|
-s | 将每个文件合并成行而不是按行粘贴 |
-d | 自定义分隔符,默认为制表符 |
常用范例
**例一:**将student.txt
和telphone.txt
文件中的内容按列拼接,可以使用如下命令:
paste student.txt telphone.txt
**例二:**将student.txt
和telphone.txt
文件中的内容按列拼接,指定分隔符为:
,可以使用如下命令:
paste student.txt telphone.txt -d ':'
**例三:**将student.txt
和telphone.txt
文件中的内容各自拼接成一行,可以使用如下命令:
paste -s student.txt telphone.txt
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
shutdown
shutdown -h now 立即关机
shutdown -h 1 一分钟后关机
shutddown -r now 立即重启
halt :关机
reboot :重启系统
sync :将内存上的数据写入磁盘(建议重启或关机前使用)
logout :注销用户(图形界面无效)
注意:不管是重启系统还是关闭系统,首先要运行sync命令,把内存中的数据写到磁盘中
说明
Linux 系统是一个多用户多任务的操作系统,任何一个要使用系统资源的用户,都必须首先向系统管理员申请一个账号,然后以这个账号的身份进入系统。
Linux 的用户需要至少要属于一个组。
基本语法
useradd [选项] 用户名
adduser 用户名
特别说明:
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 i ,mom 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 用户名
应用案例
基本语法
id 用户名
在操作 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 用户组 用户名
禁用user1帐户
查看(被锁定的用户密码栏前面会加上!)
恢复user1帐户(解除锁定)
禁用user1帐户
解除user1用户锁定
直接修改配置文件
可将/etc/passwd文件或/etc/shadow文件中关于user1帐户的passwd域的第一个字符前面加上一个“”,达到禁用
帐户的目的,在需要恢复的时候只要删除字符“”即可。
如果只是禁止用户帐户登录系统,可以将其启动Shell设置为/bin/false或者/dev/null。
用户(user)的配置文件,记录用户的各种信息
每行的含义:用户名:口令:用户标识号:组标识号:注释性描述:主目录:登录 Shell
所有用户对passwd文件均可读取,只有root用户对shadow文件可读,因此密码存放在shadow文件中更安全
口令的配置文件
每行的含义:登录名:加密口令:最后一次修改时间:最小时间间隔:最大时间间隔:警告时间:不活动时间:失效时间:标志
用户的组账户的信息存放在group文件中,任何用户都可以读取,用“:”分隔为4个域。
组(group)的配置文件,记录 Linux 包含的组的信息
每行含义:组名:口令:组标识号:组内用户列表
gshadow文件用于存放组群的加密口令、组管理员等信息,只有root用户可读,用“:”分隔成4个域
建立用户帐户时根据/etc/login.defs文件的配置设置用户帐户的某些选项。
启动Vim默认进入命令模式。此时界面不能编辑,只能接受命令(键入的命令看不到)
文件的保存,退出,文本的删除、复制、搜索等操作
编辑模式
命令模式下用i(sert),a(ppend),o,s等均可进入该模式。按esc返回命令模式
实际上也是命令模式的一种,在命令模式下输入冒号进入一个命令行,可显示地输入命令(所以也有些书认为是两种工作模式)。
启动命令:vim my.txt
如果文件存在,则vim显示文件内容并等待用户的命令。
如果指定的文件不存在,则vim将告知用户这是未命名的文件,并进入一个空白的界面。
启动vim时都是默认处于命令模式。
用户必须使用命令切换到文本输入模式才能进行输入编辑,或者可执行删除、复制等编辑命令。
冒号进命令行模式下:
不存档强制退出
:q!
保存但不退出,w(rite)后可加所要存档的文档名
:w
存档后退出
:wq
命令模式下按zz,功能与:wq相同。
:x 与 :wq 相同
命令模式:
ZZ、ZQ 保存/不保存退出
必须从命令模式转入插入模式才能进行输入编辑,可用命令有:
a:从光标所在位置后面开始新增资料
A:从光标所在行最后面的地方开始新增资料。
i:从光标所在位置前面开始插入资料
I:从光标所在行的第一个非空白字元前面开始插入资料。
o:在光标所在行下新增一列并进入输入模式。
O:在光标所在行上方新增一列并进入输入模式
冒号进入行命令模式,输入
set nu
删除光标所在字符
x
删除一个单词
dw
删除光标所在的行
dd
删除光标所在字节,并进入输入模式
s
表示数字
#
删除几个字符,如3x
#x
删除几个单词,如3dw表示删除三个单词
#dw
删除多个行,如3dd表示删除光标行及光标的下两行
#dd
删除光标到行尾的内容
d$
左:删除光标前面的字符;
右:删除光标所在的字符;
上:将当前行与上一行删除;
下:当前行与下一行删除
删除当前行之上、下的几行
文本(包括当前行)
恢复刚才被修改的文本
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)
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
注意:在单引号括起来的字符串中,反斜线也成为普通字符,而失去转义字符功能。
介绍
1)Linux Shell 中的变量分为,系统变量和用户自定义变量。
2)系统变量:$ HOME、$ PWD、$ SHELL、$ USER 等等
定义变量:变量=值
撤销变量:unset 变量
声明静态变量:readonly 变量,注意:不能 unset
案例 1:定义变量 A,然后撤销变量 A
输出:
hellp world!
A=100
A=
案例 2:显示当前 shell 中所有变量:set
set |more
变量名称可以由字母、数字和下划线组成,但是不能以数字开头。
等号两侧不能有空格,可以使用下划线(_)
变量名称一般习惯为大写
不能使用标点符号。
不能使用bash里的关键字(可用help命令查看保留关键字)
将命令的返回值赋值给变量(重点)
也就是在shell文件里使用终端的命令,并将命令返回的字符串返回给变量。
方法:
1) A=`ls -la` 反引号,运行里面的命令,并把结果返回给变量A
2) A=$(ls -la) 等价于反引号
注意:反引号在键盘esc键的下面,一般我们习惯使用上述第二种方式赋值。
案例:
将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
以上实例执行将没有任何输出
Linux里将环境变量存放在/etc/profile文件里
案例:设置tomcat的环境变量
内部变量是Linux所提供的一种特殊类型的变量,这类变量在程序中用来作出判断。在shell程序内这类变量的值是不能修改的。
部分内部变量是:
$# ——传送给shell程序的位置参数的数量
$? ——最后命令的完成码或者在shell程序内部执行的shell程序(返回值)
$0 ——shell程序的名称
$* ——调用shell程序时所传送的全部参数的单字符串, “参数1”“参数2”…形式保存的参数
$@ --“参数1”“参数2”…形式保存的参数
$n 第n个参数
$$ 本程序的PID
$! 上一个命令的PID
shift 移动参数
就是 shell 设计者事先已经定义好的变量,可以直接在 shell 脚本中使用
语法:
案例:
创建preVar.sh文件,在第二行进行后台执行position.sh(在命令后面加&),最后返回成功执行状态
Shell 和其他编程语言一样,支持多种运算符,包括:
原生bash不支持简单的数学运算,但是可以通过其他命令来实现,例如 awk 和 expr,expr 最常用。
expr 是一款表达式计算工具,使用它能完成表达式的求值操作。
例如,两个数相加(注意使用的是反引号 *\** 而不是单引号 \**
*)
#!/bin/bash
val=`expr 2 + 2`
echo "两数之和为 : $val"
结果:两数之和为 : 4
注意:
包含,注意这个字符不是常用的单引号,在 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。 |
其他检查符:
语法:
[ condition ](注意 condition 前后要有空格)
非空返回 true,可使用$?验证(0 为 true,>1 为 false)
常用判断条件
两个整数的比较
= 字符串比较
-lt 小 于
-le 小于等于
-eq 等 于
-gt 大 于
-ge 大于等于
-ne 不等于
按照文件权限进行判断
-r 有读的权限 [ -r 文件 ]
-w 有写的权限
-x 有执行的权限
按照文件类型进行判断
-f 文件存在并且是一个常规的文件
-e 文件存在
-d 文件存在并是一个目录
案例:
结果:
equal
大于
4.aaa.txt文件是否存在
5.aaa.txt文件是否有读写权限
语法
if [ 条件判断式 ];then
程序
fi
if [ 条件判断式 ]
then
程序
elif [ 条件判断式 ]
then
程序
fi
if [ 条件判断式 ]
then
程序
else [ 条件判断式 ]
then
程序
fi
注意:中括号与条件判断式之间必须要有空格
案例:判断输入参数大于等于80优秀,大于等于60及格,否则不及格
语法:
case $变量名 in
“值 1”)
如果变量的值等于值 1,则执行程序 1
;;
“值 2”)
如果变量的值等于值 2,则执行程序 2
;;
…省略其他分支…
*)
如果变量的值都不是以上的值,则执行此程序
;;
esac
案例:当命令行参数是 1 时,输出 “周一”, 是 2 时,就输出"周二", 其它情况输出 “其他”
有两种形式
for 变 量 in 值 1 值 2 值 3…
do
程序
done
案例1:打印命令行参数
for (( 初始值;循环控制条件;变量变化 ))
do
程序
done
案例2:1到100累加并输出
语法
while [ 条件判断式 ]
do
程序
done
案例:命令行输入一个数n,计算1+…+n的值
read(选项)(参数)
选项:
参数变量:指定读取值的变量名
案例:
1.读取控制台输入一个 num 值
2.读取控制台输入一个 num 值,在 10 秒内输入。
测试案例2时第一次十秒内未输入,第二次输入
shell 编程和其它编程语言一样,有系统函数,也可以自定义函数。这里介绍两个系统函数。
basename
功能:返回完整路径后面的部分,常用于获取路径名
语法:
basename[路径名][后缀]
注意:basename 命令会删掉所有的前缀包括最后一个(‘/’)字符,然后将字符串显示出来,如果
选项带有后缀,返回值将会把后缀删掉
案例:
dirname
功能描述:从给定的包含绝对路径的文件名中去除文件名(非目录的部分),然后返回剩下的
路径(目录的部分)
案例:
语法:
[ function ] funname[()]
{
Action;
[return int;]
}
案例:就是输入的两个数之和
n/20200518214739879.png)
语法:
case $变量名 in
“值 1”)
如果变量的值等于值 1,则执行程序 1
;;
“值 2”)
如果变量的值等于值 2,则执行程序 2
;;
…省略其他分支…
*)
如果变量的值都不是以上的值,则执行此程序
;;
esac
案例:当命令行参数是 1 时,输出 “周一”, 是 2 时,就输出"周二", 其它情况输出 “其他”
有两种形式
for 变 量 in 值 1 值 2 值 3…
do
程序
done
案例1:打印命令行参数
for (( 初始值;循环控制条件;变量变化 ))
do
程序
done
案例2:1到100累加并输出
语法
while [ 条件判断式 ]
do
程序
done
案例:命令行输入一个数n,计算1+…+n的值
read(选项)(参数)
选项:
参数变量:指定读取值的变量名
案例:
1.读取控制台输入一个 num 值
2.读取控制台输入一个 num 值,在 10 秒内输入。
测试案例2时第一次十秒内未输入,第二次输入
shell 编程和其它编程语言一样,有系统函数,也可以自定义函数。这里介绍两个系统函数。
basename
功能:返回完整路径后面的部分,常用于获取路径名
语法:
basename[路径名][后缀]
注意:basename 命令会删掉所有的前缀包括最后一个(‘/’)字符,然后将字符串显示出来,如果
选项带有后缀,返回值将会把后缀删掉
案例:
dirname
功能描述:从给定的包含绝对路径的文件名中去除文件名(非目录的部分),然后返回剩下的
路径(目录的部分)
案例:
语法:
[ function ] funname[()]
{
Action;
[return int;]
}
案例:就是输入的两个数之和