bash shell基础命令(一)

bash shell基础命令(一)_第1张图片

1.shell启动

shell提供了对Linux系统的交互式访问,通常在用户登录终端时启动。系统启动的shell程序取决于用户账户的配置。
/etc/passwd/文件包含了所有用户的基本信息配置,

$ cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
...

例如上述root账户信息配置包含7个数据字段,字段之间用冒号分隔。每个字段的含义后续会展开介绍,其中最后一个字段指定了用户使用的shell程序,即/bin/bash。

2. shell提示符

登录终端后会看到shell提示符$,也是默认bash shell的提示符,它表示shell在等待用户输入命令。

3. bash手册

shell中使用man命令访问Linux系统的手册,man + [命令名]显示相应命令的手册页。
例如:使用man查询拷贝(copy)命令的介绍

$ man cp
CP(1)                                               User Commands                                               CP(1)
#命令名加简短描述
NAME
       cp - copy files and directories
#命令语法
SYNOPSIS
       cp [OPTION]... [-T] SOURCE DEST
       cp [OPTION]... SOURCE... DIRECTORY
       cp [OPTION]... -t DIRECTORY SOURCE...
#命令一般性描述
DESCRIPTION
       Copy SOURCE to DEST, or multiple SOURCE(s) to DIRECTORY.

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

       -a, --archive
              same as -dR --preserve=all

       --attributes-only
              don't copy the file data, just the attributes

       --backup[=CONTROL]
              make a backup of each existing destination file

       -b     like --backup but does not accept an argument

       --copy-contents
              copy contents of special files when recursive
       ...
 #手动上下键滚动手册,h键查看帮助,空间键翻页,q键退出手册
 Manual page cp(1) line 1 (press h for help or q to quit)

man命令页支持关键词搜索,例如:

#我想查找renam(e)重命名命令手册
$ man -k renam
docker-container-rename (1) - Rename a container
docker-rename (1)    - Rename a container
dpkg-name (1)        - rename Debian packages to full package names
git-mv (1)           - Move or rename a file, a directory, or a symlink
lvrename (8)         - Rename a logical volume
mmove (1)            - move or rename an MSDOS file or subdirectory
mren (1)             - rename an existing MSDOS file
mv (1)               - move (rename) files
rename.ul (1)        - rename files
rename (2)           - change the name or location of a file
renameat (2)         - change the name or location of a file
renameat2 (2)        - change the name or location of a file
vgrename (8)         - Rename a volume group
zipnote (1)          - write the comments in zipfile to stdout, edit comments and rename files in zipfile

3.1 man手册解读

Linux手册页常用段名

描述
Name 显示命令名和简短描述
Synopsis 命令语法
Configuration 命令配置信息
Description 命令的一般性描述
Options 命令选项描述
Exit Status 命令的推出状态
Return Value 命令的返回值
Errors 命令的错误消息
Environment 命令使用的环境变量
Files 命令用到的文件
Versions 命令的版本信息
Conforming To 遵循的命令标准
Notes 其他有帮助的资料
Bugs 提交Bug的途径
Example 命令的用法示例
Authors 命令的开发人员信息
Copyright 命令源码的版权信息
See Also 与该命令类似的其他命令

如上手册页左上角和右上角CP(1)表示CP命令所在Linux的手册的第一节,为可执行程序或shell命令。
Linux手册页节

节号 所涵盖的内容
1 可执行程序或shell命令
2 系统调用
3 库调用
4 特殊文件
5 文件格式与约定
6 游戏
7 概览、约定及杂项
8 超级用户和系统管理员命令
9 内核例程(routine)

man支持查看命令特定节

$ man 2 rename
RENAME(2)                                     Linux Programmer's Manual                                     RENAME(2)

NAME
       rename, renameat, renameat2 - change the name or location of a file

SYNOPSIS
       #include 

       int rename(const char *oldpath, const char *newpath);

       #include            /* Definition of AT_* constants */
       #include 

       int renameat(int olddirfd, const char *oldpath,
                    int newdirfd, const char *newpath);

       int renameat2(int olddirfd, const char *oldpath,
                     int newdirfd, const char *newpath, unsigned int flags);

   Feature Test Macro Requirements for glibc (see feature_test_macros(7)):

       renameat():
           Since glibc 2.10:
               _POSIX_C_SOURCE >= 200809L
           Before glibc 2.10:
               _ATFILE_SOURCE
       renameat2():
           _GNU_SOURCE

 Manual page rename(2) line 1 (press h for help or q to quit)

4. 浏览Linux文件系统

Linux系统部分虚拟目录文件路径如下
bash shell基础命令(一)_第2张图片
由根目录(/)出发,访问其他目录,如上test.txt文件路径为/home/zhangsan/Doucuments/test.txt。
Linux文件通常存储在根驱动器中,而用户文件则存储在其他驱动器中。Linux会将根驱动器上一些特别的目录作为挂载点(将虚拟目录中分配额外存储设备的目录),其文件结构如下:
bash shell基础命令(一)_第3张图片
硬盘Disk2挂载在硬盘Disk1 /home目录。
Linux常见目录(基于FHS标准)及用途如下:

目录 用途
/ 虚拟目录的根目录,通常不会在这里放置文件
/bin 二进制文件目录,存放了很多用户级的GNU实用工具
/boot 引导目录,存放引导文件
/dev 设备目录,Linux在其中创建设备节点
/etc 系统配置文件目录
/home 主目录,Linux在其中创建用户目录
/lib 库目录,存放系统和应用程序的库文件
/libname 库目录,存放替代格式的系统和应用程序的库文件
/media 媒介目录,可移动存储设备的常用挂载点
/mnt 挂载目录,用于临时挂载文件系统的常用挂载点
/opt 可选目录,存放第三方软件包
/proc 进程目录,存放现有内核、系统以及进程相关的信息
/root root用户的主目录
/run 运行目录,存放系统的运行时数据
/sbin 系统二进制文件目录,存放很多管理级的GNU实用工具
/srv 服务目录,存放本地服务的相关文件
/sys 系统目录,存放设备、驱动程序以及部分内核特性信息
/temp 临时目录,可以在其中创建和删除临时工作文件
/usr 用户目录,一个次目录层级结构
/var 可变目录,存放经常变化的文件,比如日志文件

4.1 遍历目录

Linux文件系统中,使用cd命令进行目录切换

$ cd / 或 cd		#切换到根目录
$ cd ~		#切换到当前用户目录
$ cd ..		#切换到上一级目录
$ cd -		#返回上一次目录

文件目录有两种表达方式:

  • 绝对路径:定义了在虚拟目录结构中,从根目录开始的准确位置。
  • 相对路径:基于当前位置的目标路径。

4.1.1 绝对路径

绝对路径总是以根目录(/)作为起始,可以准确的表明用户想切换到的确切位置,例如

$ cd /usr/bin

查看当前目录,可以使用pwd(print work direction)命令

$ pwd
/home/zhangsan

4.1.2 相对路径

相对路径不以/开头,而是以目录名或特殊字符起始,例如

$ cd bin/		#切换至当前目录下的bin文件下
bin$
$ cd ./bin		#切换当前目录(./)下的bin目录下
$ cd ..			#切换至当前目录的上一层目录
$ cd ../../test	#切换至上上一层目录下的test目录下

4.2 列出目录和文件

通过ls命令可以列出目录及文件,常见用法如下

$ ls			#ls命令基本形式显示当前目录下的文件和目录
bin  ohos

$ ls -F		#以文件类型显示当前目录下的文件和目录;目录名后接/, 可执行文件名后接*
bin/  ohos/  test.txt my_script*

$ ls -a		#显示当前目录下所有目录和文件,包含隐藏目录和文件
.	.bash_logout	.ccache	...
..	.cache	.config	...

$ ls -R 		#显示当前目录所包含的子目录中的文件

$ ls -l		#以长列表格式显示当前目录下的文件和目录
total 8	#该目录文件锁分配的总块数
drwxrwxr-x 2 zhangsan zhangsan 4096 Dec  5 09:57 bin
drwxr-xr-x 4 zhangsan zhangsan 4096 Dec  4 14:57 ohos
-rw-r--r-- 1 zhangsan zhangsan    0 Jan 14 00:48 test.txt

目录信息解析如下
bash shell基础命令(一)_第4张图片
每个文件的属性由左边第一部分的 10 个字符来确定:
bash shell基础命令(一)_第5张图片

Linux中常见的文件类型包括:

  • 普通文件(Regular file)- 用于存储文本、数据等信息。简写为 “-”(连字符)。
  • 目录文件(Directory file)- 用于存储其他文件和目录的信息。简写为 “d”。
  • 符号链接文件(Symbolic link file)- 指向另一个文件或目录的快捷方式。简写为 “l”。
  • 套接字文件(Socket file)- 用于进程间通信的文件。简写为 “s”。
  • 块设备文件(Block device file)- 用于访问存储设备(如硬盘、U盘等)的文件。简写为 “b”。
  • 字符设备文件(Character device file)- 用于访问系统设备(如键盘、鼠标等)的文件。简写为 “c”。
  • 管道文件(FIFO file)- 用于进程间通信的文件。简写为 “p”。

ls 后面可以根特殊字符或模式通配符进行过滤

$ ls test.txt		#显示当前目录下,文件或目录名为test.txt的文件或目录
test.txt

$ ls test*			#显示当前目录下,以test开头的文件或目录
test.txt test/ test1.doc

$ ls te[!s]t		#!将不需要的内容排除在外
tet/ teat.doc tebt.txt

4.3 处理文件

4.3.1创建文件

使用touch命令创建文件,文件以当前用户名作为该文件的属主

$ touch file.text
$ ls -l file.txt
-rw-r--r-- 1 zhangsan zhangsan 0 Jan 14 01:34 file.text

$ touch 1.doc 2.doc			#touch支持同时创建多个文件
$ls -l *.doc
-rw-r--r-- 1 zhangsan zhangsan 0 Jan 14 01:36 1.doc
-rw-r--r-- 1 zhangsan zhangsan 0 Jan 14 01:36 2.doc

4.3.2 复制文件

使用cp命令复制/拷贝文件或目录,将文件或目录从一个路径复制到另外一个路径。

$ cp ./test.txt ../		#将当前目录下的test.txt拷贝至上一层目录

需要注意

  • 新路径的文件是一个全新的文件
  • 如果新路径已经存在该文件,cp会覆盖新路径的原文件,但不会提醒你,如需提醒可加上-i选项
$ cp -i ./test.txt ../test.txt
cp: overwrite '../test.txt'?		#y,覆盖;n,不覆盖
  • 目标路径为目录,则需要加/,否则表示文件
$ cp test.txt ./test			#若./test不存在,则会将原文件拷贝成目标文件名的文件
$ tree
.
├── test			#创建了新的test文件,内容与test.txt一致
└── test.txt

$ cp test.txt ./test/		#若./test不存在,则报错
cp: cannot create regular file './test/': Not a directory

$ cp test.txt ./test		#若./test目录存在,则将test.txt拷贝至./test目录下
$ tree -a
.
├── test
│   └── test.txt
└── test.txt

cp命令的其他常见用法:

$ cp ./test/test.txt .		# 将./test/test.txt文件拷贝至当前目录

$ cp -R test/ test1/		#将test目录全部文件拷贝至test1目录中

$cp -rf test/ test1/		#将test目录全部文件强制拷贝至test1目录中

4.3.3 链接文件

链接:是目录中指向文件真实位置的占位符。

4.3.3.1.软链接

软件链接是一个真实存在的文件,该文件指向存放在虚拟目录结构中的另一个文件,这两个以符号方式链接在一起的文件彼此的内容并不相同。
通过ln命令为一个文件创建链接文件

$ ln -s test.txt slink_test.txt
ls -l *test.txt
lrwxrwxrwx 1 zhangsan zhangsan 8 Jan 14 20:11 slink_test.txt -> test.txt
-rw-r--r-- 1 zhangsan zhangsan 0 Jan 14 01:45 test.txt

注意:slink_test.txt与test.txt的文件大小并不相同,着说明它们是两个完全不同的文件。

4.3.3.2 硬链接

硬链接创建的是一个独立的虚拟文件,包含了原文件的信息及位置,本质是同一个文件。

$ ln test.txt hlink_test.txt
$ ls -l *test.txt
-rw-r--r-- 2 huzhou huzhou 0 Jan 14 01:45 hlink_test.txt
-rw-r--r-- 2 huzhou huzhou 0 Jan 14 01:45 test.txt

注意硬链接不能跨文件系统,而软链接可以。

4.3.4 文件重命名

使用mv命令,进行文件重命名与文件移动相同,将文件或目录移动到另一个位置或者重新命名。

#将当前目录的test.txt重命名为test_bak.txt
$ mv ./test.txt ./test_bak.txt
$ ls -l test*.txt
-rw-r--r--  2 zhangsan zhangsan     0 Jan 14 01:45 test_bak.txt

mv命名只影响文件名

4.3.5 删除文件

使用rm命令删除文件或文件夹,常见使用方式如下:

$ rm ./test.txt			#删除当前目录下test.txt文件
$ rm -i ./test.txt		#删除文件前先询问是否真的要删除文件。
rm: remove regular empty file './test_.txt'?
$ rm -rf ./test			#强制删除当前目录下test文件夹(所有文件)
$ rm -rf test*.txt		#强制删除以test开头,.txt结尾的文件

4.3.6 创建目录

使用mkdir命令创建目录

$ mkdir test		#在当前目录下创建test文件夹
$ mkdir -p testA/testB/testC	#根据需要创建确实的父目录

4.3.7 删除目录

使用rm -r 或rm -R删除目录

$ rmdir test		# rmdir只能删除空目录
rmdir: failed to remove 'test': Directory not empty
$ rm -r test		#递归删除test目录内容

4.3.8 查看文件

4.3.8.1查看文件类型

使用file命令查看文件类型

$ file test.txt			#查看文件类型,test.txt是ASCII文本文件
test.txt: ASCII text

$ file test/			#查看目录文件类型,test是目录
test/: directory

$ file /usr/bin/ls
/usr/bin/ls: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=2f15ad836be3339dec0e2e6a3c637e08e48aacbd, for GNU/Linux 3.2.0, stripped
4.3.8.2 查看文件内容

使用cat查看文件详细内容

$ cat test.txt			#查看test.txt文件所有内容
this is a test file

$ cat -n test.txt		#查看test.txt文件所有内容,并显示行号
     1  this is a test file

对于大文件而言,cat在查看文件内容时会一闪而过,可以使用more命令(分页工具+),按页显示文本内容

$ more /etc/profile

more命令还有一个升级版本,即less,它比more提供了前后翻页和搜索等功能。

$ less /etc/profile

head命令,查看文件的最开始几行内容,默认10行

$ head ./test.txt		#查看./test.txt文件的前10行
$ head -n -2 ./test.txt	#查看./test.txt文件的前2行

tail命令,查看文件的最后几行内容,默认10行

$ tail /etc/profile			#查看/etc/profile文件的最后10行内容
$ tail -n 2 /etc/profile	#查看/etc/profile文件的最后2行内容

你可能感兴趣的:(Linux,shell,bash,linux,shell)