四.shell基础

1.shell概念

提高用户访问操作系统的接口。

三次含义:

shell命令:可执行程序

命令解释器:默认的命令解释器是bash(/bin/bash)

shell编程

2.shell语法

格式:命令名  选项  参数

命令名:小写,单词或者缩写

选项:对命令的特别定义

     短选项  -字母  (常用)   -a

     长选项  --单词          --all
     
多个选项:

分开写:-a  -l

合并写:-al

参数:提供命令运行时所需信息,参数一般是文件名或者目录名

 缺省参数:当前工作目录

命令名、选项、参数必须加空格。

3.查看帮助信息

 1)man命令:    man  命令名
 
 2)pinfo命令:    pinfo  命令名
 
 3)help命令:    help    内建命令       
 
 4)--help选项:外部命令  --help

4.目录操作命令

1)创建目录mkdir

(make directory)

语法:mkdir [选项] <目录名>

选项:

-p          创建目录时,若上级目录不存在一并创建

-m   权限     创建目录时,为目录设置权限(不使用-m时,有默认权限)

例如:

在当前目录下创建一个名为dashuju20-1的目录:

mkdir  dashuju20-1

在当前目录下的dashuju20-1目录(不存在)下为每个同学创建一个子目录,子目录名为20308001-20308048:

     

    mkdir -p dashuju20-1/203080{01..48}

在当前目录下的dashuju20-1目录(不存在)下为每个同学创建一个子目录,子目录名为20308001-20308048,再在每个同学的子目录下创建3个课程目录,分别为Linux、Network、English:

    mkdir -p dashuju20-1/203080{01..48}/{Linux,Network,English}

在当前目录下创建一个以姓名命令的目录,其权限设置为rwxrw-r--:

    mkdir -m  u=rwx,g=rw,o=r  zhangsan

    mkdir -m  764  zhangsan

在当前目录下创建一个名为dashuju20-1的隐藏目录:

mkdir .dashuju20-1

2)切换目录cd

(change directory)

语法:cd <目录路径>

路径:

相对路径:参考当前工作

绝对路径:参考根目录

缺省路径时,默认切换到当前用户的家目录。

路径符号:

  .    当前工作目录
  
  ..    上级目录
  
  ~    当前用户的家目录   cd ~等级于cd
  
  ~user    user用户的家目录   cd ~user
  
  -    上次工作
  
     ../..   上上级目录
  
  /    根目录

家目录路径:

管理员:/root

普通用户:/home/与用户名同名的目录

3)复制目录cp

(copy directory )

4)移动目录mv

(move directory)

5)显示当前工作目录绝对路径pwd

(present working directory)

用法:pwd

6)删除目录rmdir/rm -r

(remove directory)

语法:rmdir 空目录

语法:rm -r 空或者非空目录

5.ls 列出目录的内容

语法:ls [选项] <目录名或者文件名>

参数:

目录名:列出该目录下的文件

文件名:列出该文件
 
参数缺省时,列出当前目录下的文件。

选项:



-l    列出文件的详细信息        (重点)

-a    列出所有文件,包含隐藏文件

-A    列出所有文件,包含隐藏文件,但不包含“.”和“..”

-i    显示文件的inode编码

-R    递归显示子目录

-d    像文件一样显示目录,不展开目录下的内容

ls -l 结果:

drwxr-xr-x. 3 root root 56 3月 31 11:00 dst

文件类型 文件的权限 其他的控制措施 链接数 文件拥有者 属组 文件大小 文件修改时间 文件名

文件类型:

  • 文本文件

d 目录文件

l 软链接文件

c 字符设备文件

b 块设备文件

p 管道文件

s 套接字文件

其他的控制措施:



  空格   没有使用其他控制措施

  .     使用了SELinux上下文控制措施

  +        使用了ACL控制措施

链接数:

 目录:子目录的个数
 
 文件:硬链接的个数(硬链接就是为文件提供了不同的访问接口)

通配符:

 ls  file?                    ?       任意的一个字符
 
 ls  file*                 *       任意(没有、一个、多个)的字符

 ls  file_[ace]             []      匹配[]中的某一个字符

 ls  file_[!ace]                 [!]     不能包含[]中的任意一个字符

 ls  file_[1-5]             [1-5]  匹配[]中该范围内的某个字符        

 ls  file_{a,c,e}             {}      匹配{}中的某一个字符        

 ls  file_{1..5}             {1..5} 匹配{}中该范围内的某个字符     

 ls  file_{first,second,third}       {first,second,third}    匹配{}中的某一个字符串

注:如果匹配的文件都不存在时,[ ]会失去模式的功能,变成一个单纯的字符串,且[ ]只能查找文件

{ }可查找文件、创建文件、生成序列字符转义:字符可以作为文件名的一部分

file*

'file*'

"file*"

当文件名不确定时,只能用""进行转义。

当文件名确定时,三种方法都可以。

例如:列出以file开头,中间是任意字符,结尾以“*”命名的文件

 ls file*\* 

文件颜色:

蓝色 目录文件

黑色 文本文件

绿色 可执行文件

红色 压缩文件

浅蓝色 软链接文件

蓝底白字: 硬链接文件

黑底黄字: 设备文件

黑底红字 被损坏的文件


6.文件的操作命令

(1)创建文件 touch

语法:touch [选项] <文件名...>

选项:

-a 修改访问时间

-m 修改修改时间

-d 年月日 使用指定的时间作为时间戳

-t 月日时分 使用指定的时间作为时间戳

-r <参考文件> 创建文件是参考指定文件的时间

例如:

touch file1


(2)复制文件/目录 cp

①cp [选项]... 源文件 目标文件            #复制并重命名

  ②cp [选项]... 源文件... 目录 #仅复制

  ③cp [选项]... -t 目录 源文件... #仅复制

选项:

-f         强制覆盖已经存在的文件
-i        覆盖之前会询问    
-n        不会覆盖已存在文件
-u        只有源文件比目标文件新时,才覆盖;如果目标文件不存在,就直接复制
-r        递归复制目录(▲复制目录时必须用该选项)
-p        复制文件时保留属性

eg: src 、dst 为目录

 

cp src/file dst    #把src目录下的file1复制到dst目录下    
(普通用户操作就相当于强制覆盖,管理员操作时会询问)    

cp src/file file11      #把src目录下的file1复制到dst目录下,并重命名file11    (如果第二参数是目录就复制,如果不是就复制并重命名)

cp -f src/file1 dst    #目标文件不存在就复制,存在则强制覆盖

cp - i src/file1 dst    #目标文件不存在就复制,存在则在覆盖之前会询问

cp - n src/file1 dst   #目标文件不存在就复制,存在就不覆盖
    
cp - u src/file1 dst   #目标文件不存在就复制,存在时只有源文件,比目标文件新时才覆盖

cp - p src/file1 dst   #复制文件时,保留属性

cp - r src      dst     #把src目录复制到dst目录

cp  file1/file2  dst  或者  cp  -t  dst  file1  file2

(3)移动文件/目录 mv

★移动与复制的区别:复制后,源文件存在。移动后,源文件不存在。

①mv [选项]... 源文件 目标文件            #移动并重命名

  ②mv [选项]... 源文件... 目录 #仅移动

  ③mv [选项]... -t 目录 源文件... #仅移动

选项:没有-r和-p(移动目录不需要-r。没有-p选项,移动时默认保留属性)

-f         强制移动已经存在的文件
-i        移动之前会询问    
-n        不会移动已存在文件
-u        只有源文件比目标文件新时,才移动;如果目标文件不存在,就直接移动

eg:src 、dst 为目录

移动目录: mv src dst    (注意:移动目录不需要使用-r)

(4)删除文件/目录 rm

语法:rm [选项] <文件/目录...>

-f    强制执行(文件存在时直接删除不提示,文件不存在时直接删除不提示)
-i    删除时会询问
-r    递归删除目录(删除目录时必须用-r)

eg:

rm file1     #文件存在,强制删除。文件不存在,删除时会报错
rm -f flie1  #文件存在,强制删除.文件不存在直接忽略不提示
rm -i flie1  #文件存在,删除会询问.文件不存在,删除时会报错
rm -r          #目录存在,强制删除。目录不存在,删除时会报错
                                                                                                                      ★只要删除目录必须使用-r。

(5)查看文件类型 file

 

①ls -l 结果第一个字符
②文件颜色
③file

语法:file [文件] <参数或目录名>

eg: file file1 src

file * (找所有文件)

(6)显示文件内容 cat/head/tail/more/less

1)cat

显示整个文件的内容

语法:cat [选项] <文件名...>

选项:

​ -n 对每一行进行编号(编号从1开始)

​ -b 只对非空白行编号(编号从1开始)

​ -s 合并两行以上的连续空白行为一行

eg: cat -n file1 #显示file1内容时对每一行就行编号

​ cat -b file1 #显示file1内容时只对非空白行进行编号

​ cat -s file1 #显示file1内容时,合并连续空白行为一行

​ cat file1 file2 #同时显示file1 和file2 文件的内容

2)head

显示文件前几行或前几个字符

语法:head [选项] <文本文件名.....>

选项:

​ -n 行数 num #显示前num行内容

​ -c 字符数num #显示前num字符数

​ -v #显示文件名

eg:

①显示passwd文件前5行内容:

​ head -n 5 passwd

​ head -5 passwd(只能按行)

②显示passwd文件前4个字符:

​ head -c 4 passwd

③显示passwd和file1文件时,同时显示文件名:

​ head -v passwd file1 #默认显示每个文件前10行的内容

④显示passwd文件前10行内容:

​ head -n10 passwd

​ head passwd

3)tail

显示文件后几行或后几个字符

语法: tail [选项] <文件名.....>

选项:(没跟选项默认显示后10行)

​ -n 行数 num #显示后num行内容

​ -c 字符数num #显示后num字符数

​ -v #显示文件名

eg:

​ tail -c 5 passwd #显示passwd后五个字符(★包含非显示字符。eg:结束符)

​ tail passwd #显示passwd后10行内容


4)more

翻页查看文件内容

more 被查看文件名


5)less

翻页查看文件内容(功能更强)

语法: less [选项] <文件名>

选项:

         -m     显示百分比
 
         -N      显示行号

eg:

​ less -mN passwd


(7) 创建链接文件 ln link

链接文件分类:

​ 软连接(符号链接):相当于快捷方式 浅蓝色

​ 硬链接:为同一文件提供不同访问接口 蓝底白字

语法:ln [选项] <源文件> <链接文件>

选项:(不使用-s 默认为硬链接)

​ -s 创建软连接/符号链接 symbolic

​ -f 如果目标文件(链接文件)存在,强制覆盖

​ -i 如果目标文件(链接文件)存在,覆盖之前会询问

eg:

给passwd文件创建一个软连接,名为passwd_s:

​ ln -s passwd passwd_s

给passwd文件创建一个软连接,名为passwd_l:

​ ln passwd passwd_l

★软连接的注意事项:

  • 通过软连接文件可以对源文件进行读写执行操作。
  • 软连接文件和源文件时不同的文件。
  • 删除软连接文件,不影响源文件。
  • 对源文件进行删除、重命名、移动会导致软连接找不到所指向的文件,链接就变成”断裂“的链接。

可以对任何文件创建软软连接文件。

★软硬连接的注意事项:

  • 不能给目录创建硬链接。
  • 同时也不能跨文件系统、分区创建硬链接。
  • 只有在硬链接数变成0,即所有访问接口都被删除,文件才被删除。

(8)切换用户 su switch user

语法: su <用户名>

eg:

切换到管理员 su root 或者 su(省略用户时,默认切换到管理员)

切换到普通用户stu: su stu

从管理员切换到普通用户不需要输入密码,切换到那个用户就输入哪个用户的密码。


(9)显示系统中登录的用户 who和 whoami

who:显示系统中所有登录用户,一般和 -H 使用

语法: who [选项] <参数>

whoami:只显示当前用户


(10)查询命令的存放路径which

命令属于可执行文件

语法:which 被查看命令

eg:

​ whic who


(11)关机和重启命令 shutdown

★(只有管理员才能执行)

语法:shutdown [选项] 时间 提示信息

选项:(省略选项时默认时关机,省略时间默认1分钟)

​ -P 关机

​ -h 关机

     -r        重启

​ -k 只发送提示信息 ,不执行关机或者重启操作:

​ -c 撤销关机或者重启操作

eg:

<!--关机操作-->

请在5分钟后关机,并提示“Shutdown after 5 minutes”

​ shutdown -h 5 “Shutdown after 5 minutes ” 或者 shutdown -h +5 “Shutdown after 5 minutes ”

或者 shutdown +5 “Shutdown after 5 minutes ” 或者 shutdown 5 “Shutdown after 5 minutes ”

请立即关机,并提示“shutdown now”

shutdown -h now “shutdown now” 或者 shutdown -h 0 “shutdown now” 或者 shutdown -h +0 “shutdown now”

请在10:00关机,并提示“shutdown at 10:00am”

shutdown -h 10:00 “shutdown at 10:00am”

<!--重启操作-->

请在00:00重启,并提示“Reboot at 00:00am”

​ shutdown -r 00:00 “Reboot at 00:00am”

<!--取消关机和重启操作-->

              shutdown  -c

<!--发送提示信息-->

​ shutdown -k 20 “Don't shutdown or reboot ”


(12)查看历史命令 history

执行过的命令,是保存到缓存的,当退出终端时,默认保存到 ~/.bash_history 文件

快捷键:

​ 上下键:查看执行过的命令

​ !n 重新执行地n条历史命令

​ !! 重新执行上一条历史命令

​ !string 重新执行以”string“字符串开头的命令

history命令

语法:history [选项] <参数>

选项:

​ -a #将缓存的中历史命令保存到 ~/.bash_history

​ -c #清空缓存的命令

​ -d 数字n #删除缓存中第n条命令

eg:

history -a

history -c

history -d 999 #删除缓存中第999条命令

history 5 #显示最后五条历史命令

history #显示history中所有的历史命令


(13)其他命令

clear 清屏

uname 显示系统信息

date 显示日期

cal 显示日历 (默认的当月日历)

Last modification:November 16, 2021
如果觉得我的文章对你有用,请随意赞赏