前言:
Shell(如Bash、Zsh)是一个用户应用程序,通过系统调用接口与内核空间进行交互,运行在所示位置在用户空间中。
GNU/Linux内核架构简易图:
1.基础命令行操作
1.1 Shell功能定义
- 命令行解释器:Shell解释用户输入的命令,并执行相应的操作。
- 脚本执行:Shell可以执行Shell脚本文件,这些脚本文件包含一系列命令。
- 系统调用:Shell通过系统调用与内核空间进行交互,例如打开文件、读取文件、执行程序等。
- 环境变量:Shell管理环境变量,这些变量可以被用户空间中的其他应用程序使用。
- 进程管理:Shell可以启动、停止和管理用户空间中的进程。
- 常见的Shell类型:Bash(Linux标准默认)、Zsh、Ksh、Sh等。
- 如何打开终端:
- GNOME桌面环境:通常可以在应用菜单中找到“终端”选项来打开终端。
- KDE桌面环境:在菜单中寻找类似“系统工具”或“终端”的选项来打开终端。此外,在很多Linux系统中,也可以使用快捷键(如Ctrl+Alt+T)打开终端。
1.2 shell基本命令格式和选项
-
命令的基本结构:
command [options] [arguments]
# command:要执行的命令名称。
# options:可选参数,用于修改命令的行为。
# arguments:命令操作的对象或参数。
- 代码示例:
ls -l /home/user
# ls:命令,用于列出目录内容。
# -l:选项,以长格式显示目录内容。
# /home/user:参数,指定要列出内容的目录。
# 注意事项:
# 命令、选项和参数之间通常用空格分隔。
# 选项和参数的顺序可能会影响命令的执行结果,具体取决于命令的设计。
# 有些命令可能不需要选项或参数,而有些命令可能需要多个选项和参数。
# 通过这种基本格式,用户可以灵活地组合命令、选项和参数,以实现各种不同的操作和功能。
1.3shell常用操作指令
常用操作如下图所示:
1.4Linux快捷键
为了更好的在linux操作系统运行,在这就简单说下linux的常用命令,如下所示:
2.文件和目录操作
需要注意这里的文件和目录操要分开理解,不然容易混淆,操作指令如下图所示:
2.1 文件的基本命令
2.1.1创建文件
- touch:用于创建一个新的空文件。
touch filename
2.1.2查看文件内容
- cat:用于查看文件的内容。
bash
cat filename
- less:用于分页查看文件内容,支持上下滚动。
bash
less filename
- head:用于查看文件的前几行内容。
bash
head -n 5 filename # 查看文件的前5行
- tail:用于查看文件的后几行内容。
bash
tail -n 5 filename # 查看文件的后5行
2.1.3编辑文件
- nano:一个简单易用的文本编辑器。
bash
nano filename
- vim:一个功能强大的文本编辑器,需要一定的学习成本。
bash
vim filename
2.1.4复制文件
- cp:用于复制文件。
bash
cp source_file destination_file
- cp -r:用于复制目录及其内容。
bash
cp -r source_directory destination_directory
2.1.5 移动文件
- mv:用于移动文件或重命名文件。
bash
mv source_file destination_file
2.1.6删除文件
- rm:用于删除文件。
bash
rm filename
- rm -r:用于删除目录及其内容。
bash
rm -r directory_name
2.1.7文件权限
- chmod:用于修改文件或目录的权限。
bash
chmod 755 filename # 设置文件权限为rwxr-xr-x
- chown:用于修改文件或目录的所有者。
bash
chown user:group filename # 设置文件的所有者为user,所属组为group
2.1.8文件查找
- find:用于在指定目录下查找文件。
bash
find /path/to/search -name "filename"
2.1.9文件比较
- diff:用于比较两个文件的差异。
bash
diff file1 file2
2.1.10文件链接
- ln:用于创建文件的硬链接或软链接。
bash
ln source_file link_name # 创建硬链接 ln -s source_file link_name # 创建软链接
2.2 目录的基本命令
2.2.1创建目录
- mkdir:用于创建一个新的目录。
bash
mkdir directory_name
2.2.2查看目录内容
- ls:用于列出目录中的文件和子目录。
bash
ls directory_name
- ls -l:以长格式列出目录中的文件和子目录,包括文件权限、所有者、大小等详细信息。
bash
ls -l directory_name
- ls -a:列出目录中的所有文件和子目录,包括隐藏文件(以.开头的文件)。
bash
ls -a directory_name
2.2.3切换目录
- cd:用于切换当前工作目录。
bash
cd directory_name
- cd ..:切换到上一级目录。
bash
cd ..
- cd ~:切换到当前用户的主目录。
bash
cd ~
2.2.4复制目录
- cp -r:用于复制目录及其内容。
bash
cp -r source_directory destination_directory
2.2.5移动目录
- mv:用于移动目录或重命名目录。
bash
bash
mv source_directory destination_directory
2.2.6删除目录
- rm -r:用于删除目录及其内容。
bash
rm -r directory_name
2.2.7目录权限
- chmod:用于修改目录的权限。
bash
chmod 755 directory_name # 设置目录权限为rwxr-xr-x
- chown:用于修改目录的所有者。
bash
chown user:group directory_name # 设置目录的所有者为user,所属组为group
2.2.8目录查找
- find:用于在指定目录下查找目录。
bash
find /path/to/search -type d -name "directory_name"
2.2.9目录大小
- du:用于查看目录的大小。
bash
du -sh directory_name # 以人类可读的格式显示目录大小
这些命令是Linux环境中目录操作的基础,掌握它们可以帮助你更高效地管理目录。
3.系统信息和管理
操作指令如下图所示:
3.1查看系统信息
- uname:用于显示系统信息。
bash
uname -a # 显示所有系统信息
- hostname:用于显示或设置系统的主机名。
bash
hostname # 显示当前主机名
- uptime:用于显示系统运行时间和平均负载。
bash
uptime
- df:用于显示文件系统的磁盘空间使用情况。
bash
df -h # 以人类可读的格式显示磁盘空间使用情况
- free:用于显示系统内存使用情况。
bash
free -h # 以人类可读的格式显示内存使用情况
3.2管理用户权限
- chmod:用于修改文件或目录的权限。
bash
chmod 755 filename # 设置文件权限为rwxr-xr-x
- chown:用于修改文件或目录的所有者。
bash
chown user:group filename # 设置文件的所有者为user,所属组为group
- su:用于切换用户。
bash
su username # 切换到username用户
- sudo:用于以超级用户权限执行命令。
bash
sudo command # 以超级用户权限执行command命令
3.3系统管理
- systemctl:用于管理系统服务。
bash
systemctl start service_name # 启动服务 systemctl stop service_name # 停止服务 systemctl restart service_name # 重启服务 systemctl status service_name # 查看服务状态
- reboot:用于重启系统。
bash
reboot
- shutdown:用于关闭系统。
bash
shutdown -h now # 立即关闭系统 shutdown -r now # 立即重启系统
- top:用于实时显示系统中各个进程的资源占用情况。
bash
top
- ps:用于显示当前系统中的进程信息。
bash
ps aux # 显示所有进程的详细信息
- kill:用于终止指定进程。
bash
kill PID # 终止PID对应的进程
- killall:用于终止指定名称的所有进程。
bash
killall process_name # 终止所有名为process_name的进程
这些命令是Linux系统中Shell系统信息、用户权限和系统管理的基础,掌握它们可以帮助你更高效地管理系统。
4.网络命令
指令如下所示:
4.1IP地址管理
4.1.1 ifconfig(查看IP地址)
- 功能:显示或配置网络接口。
- 示例:
bash
ifconfig eth0 up # 启用eth0网卡 ifconfig eth0 down # 禁用eth0网卡 ifconfig eth0 192.168.1.100 netmask 255.255.255.0 # 设置eth0的IP地址和子网掩码
4.1.2 ip addr show(查看IP地址)
- 功能:显示网络接口的IP地址信息。
- 示例:
bash
ip addr show eth0 # 显示eth0接口的IP地址
4.1.3 ip route show(路由器管理)
- 功能:显示路由表信息。
- 示例:
bash
ip route show # 列出所有路由规则
4.2网络连通性测试
4. 2.1 ping (ping测试)
- 功能:发送ICMP回声请求到指定主机,测试网络连通性。
- 示例:
bash
ping google.com # 测试与Google服务器的连接
4.2.2 traceroute (traceroute测试)
- 功能:显示数据包到达目标主机所经过的路由。
- 示例:
bash
traceroute google.com # 显示到达Google服务器的路径
4.3网络服务状态
4.3.1 netstat (netstat 查看)
- 功能:显示网络连接、路由表、接口统计等信息。
- 示例:
bash
netstat -tulnp # 显示所有监听的TCP、UDP端口及对应的程序
4.3.2 ss (ss查看)
- 功能:类似于netstat,但更高效,显示套接字统计信息。
- 示例:
bash
ss -tulnp # 显示所有监听的TCP、UDP端口及对应的程序
4.4域名解析
4.4.1 nslookup (nslookup 查询)
- 功能:查询DNS以获取域名的IP地址或其他DNS记录。
- 示例:
bash
nslookup google.com # 获取Google的IP地址
4.4.2 dig (dig查询)
- 功能:类似于nslookup,但功能更强大,用于查询DNS记录。
- 示例:
bash
dig google.com # 获取Google的DNS记录
4.5网页访问
4.5.1 curl (curl访问)
- 功能:从URL下载数据或将数据上传到URL。
- 示例:
bash
curl https://www.google.com # 下载Google主页的内容
4.5.2 wget (wget下载)
- 功能:从网络下载文件。
- 示例:
bash
wget https://www.google.com # 下载Google主页的内容并保存为文件
4.6远程登录与文件传输
4.6.1 ssh (ssh登录)
- 功能:使用SSH协议远程登录到另一台计算机。
- 示例:
bash
ssh user@hostname # 登录到指定主机
4.6.2 scp (登录)
- 功能:使用SSH协议在本地和远程主机之间复制文件。
- 示例:
bash
scp file.txt user@hostname:/path/to/destination # 将file.txt复制到远程主机的指定目录
14. rsync (rsync同步)
- 功能:高效地同步文件和目录,支持增量传输。
- 示例:
bash
rsync -avz /path/to/source user@hostname:/path/to/destination # 同步本地目录到远程主机
4.7防火墙管理
4.7.1 iptables (iptables 查看)
- 功能:显示当前的iptables防火墙规则。
- 示例:
bash
iptables -L # 列出所有防火墙规则
4.7.2 ufw (ufw 状态)
- 功能:显示Uncomplicated Firewall (UFW)的状态。
- 示例:
bash
ufw status # 查看UFW防火墙的状态和规则
5. Shell脚本编写
5.1 Shell脚本的基本结构
Shell脚本通常以#!/bin/bash
开头,这是指定使用Bash作为解释器。脚本的主体部分包含一系列的命令和控制结构。
example.sh
#!/bin/bash
# 这是一个简单的Shell脚本示例
# 输出Hello, World!
echo "Hello, World!"
5.2 变量
变量用于存储数据。在Shell脚本中,变量名通常由字母、数字和下划线组成,但不能以数字开头。变量名是区分大小写的。
example.sh
#!/bin/bash
# 定义变量
name="John"
age=30
# 使用变量
echo "My name is $name and I am $age years old."
5.3 输入和输出
echo
命令用于输出文本到终端。read
命令用于从用户输入读取数据。
example.sh
#!/bin/bash
# 读取用户输入
echo "Please enter your name:"
read name
# 输出用户输入
echo "Hello, $name!"
5.4 条件语句
if
语句用于根据条件执行不同的代码块。case
语句用于多条件判断。
example.sh
#!/bin/bash
# 判断一个数是否为正数
# 提示用户输入一个数字
echo "Please enter a number:"
# 读取用户输入的数字,并将其赋值给变量 num
read num
# 使用 if-elif-else 语句判断 num 的正负性
if [ $num -gt 0 ]; then
# 如果 num 大于 0,输出 num 是正数
echo "$num is a positive number."
elif [ $num -lt 0 ]; then
# 如果 num 小于 0,输出 num 是负数
echo "$num is a negative number."
else
# 如果 num 既不大于 0 也不小于 0,即 num 等于 0,输出 num 是零
echo "$num is zero."
fi
# 判断一个字符是元音还是辅音
# 提示用户输入一个字符
echo "Please enter a character:"
# 读取用户输入的字符,并将其赋值给变量 char
read char
# 使用 case 语句判断字符的类型
case $char in
# 如果字符是 a、e、i、o、u 中的任意一个(不区分大小写),则认为是元音
[aeiouAEIOU])
echo "$char is a vowel."
# 使用双分号 ;; 表示该 case 分支结束
;;
# 如果字符是任意字母(大小写均可),则认为是辅音
[a-zA-Z])
echo "$char is a consonant."
;;
# 如果字符不是上述两种情况,输出该字符不是字母
*)
echo "$char is not a letter."
;;
esac
5.5 循环
for
循环用于遍历一个列表或范围。while
循环用于在条件为真时重复执行代码块。until
循环与while
循环相反,当条件为假时重复执行代码块。
example.sh
#!/bin/bash
# for循环示例
echo "Numbers from 1 to 5:"
for i in {1..5}; do
echo $i
done
# while循环示例
echo "Countdown from 5 to 1:"
count=5
while [ $count -gt 0 ]; do
echo $count
count=$((count - 1))
done
# until循环示例
echo "Count up from 1 to 5:"
num=1
until [ $num -gt 5 ]; do
echo $num
num=$((num + 1))
done
5.6 函数
函数用于封装可重用的代码块。函数可以接受参数,并返回一个值。
example.sh
example.sh
#!/bin/bash
# 定义函数
greet() {
echo "Hello, $1!"
}
# 调用函数
greet "Alice"
greet "Bob"
5.7 命令替换
命令替换允许将命令的输出作为变量的值。可以使用反引号(`
)或$()
来实现命令替换。
example.sh
#!/bin/bash
# 获取当前日期和时间
current_date_time=$(date +"%Y-%m-%d %H:%M:%S")
# 输出当前日期和时间
echo "Current date and time: $current_date_time"
6.输入输出重定向和管道
6.1 输入输出重定向
6.1.1 标准输入重定向 (<
)
在 shell 中,标准输入(stdin)默认是从键盘获取输入,其文件描述符为 0。使用 <
符号可以将文件内容作为命令的输入。
# 将 file.txt 文件的内容作为 cat 命令的输入
cat < file.txt
这里 cat
命令通常用于显示文件内容,通过 <
重定向,它会读取 file.txt
的内容并输出。
6.1.2 标准输出重定向 (>
和 >>
)
标准输出(stdout)默认是将命令的结果显示在终端上,文件描述符为 1。
>
:用于覆盖输出,即如果目标文件已经存在,会先清空文件内容再写入新内容。
# 将 "Hello" 写入 output.txt 文件,如果文件存在则覆盖其原有内容
echo "Hello" > output.txt
>>
:用于追加输出,会将新内容添加到目标文件的末尾。
# 将 "World" 追加到 output.txt 文件末尾
echo "World" >> output.txt
6.1.3 标准错误重定向 (2>
和 2>>
)
标准错误(stderr)用于输出命令执行过程中的错误信息,文件描述符为 2。
2>
:用于覆盖错误输出,会清空目标文件并写入新的错误信息。
# 将 ls 命令查找不存在目录时产生的错误信息写入 error.txt 文件
ls /nonexistent 2> error.txt
2>>
:用于追加错误输出,会将新的错误信息添加到目标文件末尾。
# 再次执行 ls 命令查找不存在目录,将错误信息追加到 error.txt 文件末尾
ls /nonexistent2 2>> error.txt
6.1.4 set -v
调试选项
set -v
选项会在脚本执行时显示所有读入的行,方便查看脚本的执行流程。以下是一个示例脚本:
#!/bin/bash
set -v
echo "This is a test."
echo "The script is running."
执行该脚本时,终端会显示每行代码及其执行结果,有助于调试复杂脚本。
6.1.5 set -e
调试选项
set -e
选项会使脚本在遇到任何返回非零状态(表示错误)的命令时立即退出。示例脚本如下:
test_script2.sh
#!/bin/bash
set -e
ls /nonexistent # 这个命令会失败
echo "This line will not be executed if the above command fails."
在这个脚本中,由于 ls /nonexistent
命令会失败,脚本会立即退出,不会执行后面的 echo
语句。
6.2 管道 (|
)
管道是一种在 shell 中用于连接多个命令的机制,使用 |
符号。管道的作用是将前一个命令的标准输出作为后一个命令的标准输入。
# 将 ls 命令的输出作为 grep 命令的输入,查找包含 "txt" 的文件名
ls | grep txt
在这个例子中,ls
命令列出当前目录下的所有文件和目录,其输出通过管道传递给 grep
命令,grep
命令会在这些输出中查找包含 "txt" 的行并输出。
管道可以连接多个命令,形成一个命令链,每个命令处理前一个命令的输出,从而实现复杂的数据处理。例如:
# 列出当前目录下的所有文件和目录,通过管道传递给 wc 命令统计行数
ls | wc -l
这里 ls
列出文件和目录,wc -l
统计输入的行数,最终输出当前目录下文件和目录的数量。
7.正则表达式和文本处理
正则表达式是一种用于匹配和处理文本的强大工具,在 Linux 系统中,grep
命令常与正则表达式结合使用来搜索文本。下面详细解释你提到的几个正则表达式示例:
基础概念
在正则表达式中,一些特殊字符有特定的含义:
^
:匹配行的开头。[ ]
:匹配方括号内指定的任意一个字符。\d
:匹配任意数字,等价于[0-9]
。*
:匹配前面的元素零次或多次。
示例分析
(1)grep "^[a-zA-Z]"
grep "^[a-zA-Z]" file.txt
- 解释:此正则表达式用于搜索以字母开头的行。
^
表示匹配行的开头,[a-zA-Z]
表示匹配任意一个大小写字母。所以该命令会在file.txt
文件中查找所有以字母开头的行,并将这些行输出。
(2)grep "^\d" file.txt
grep "^\d" file.txt
- 解释:这个命令用于查找
file.txt
中以数字开头的行。^
同样表示行的开头,\d
是一个元字符,代表任意数字。因此,该命令会筛选出所有以数字开头的行。
(3)grep "oo*" file.tx
grep "oo*" file.txt
- 解释:此正则表达式用于查找包含一个或多个
o
的行。o
是要匹配的字符,*
表示前面的字符o
可以出现零次或多次。所以它会匹配包含o
、oo
、ooo
等情况的行。
匹配以 "abc" 开头的行
grep "^abc" file.txt
这里 ^
确保匹配从行的开头开始,所以只会输出以 "abc" 开头的行。
匹配包含数字的行
grep "\d" file.txt
\d
匹配任意数字,该命令会查找 file.txt
中包含数字的所有行。
匹配以 "xyz" 结尾的行
grep "xyz$" file.txt
$
是另一个元字符,用于匹配行的结尾,所以此命令会输出以 "xyz" 结尾的行。
通过使用不同的正则表达式元字符和组合,可以灵活地对文本进行搜索和筛选,满足各种复杂的文本处理需求。
8.压缩和归档
8.1压缩命令
(1) gzip
gzip
是一个广泛使用的压缩工具,它采用 Lempel - Ziv 编码(LZ77)算法,压缩后的文件扩展名为 .gz
。
基本用法:
gzip file.txt
上述命令会将 file.txt
压缩为 file.txt.gz
,并且原文件 file.txt
会被删除。
常用参数:
-k
:保留原始文件,不删除。
gzip -k file.txt
-d
:解压缩文件,等同于gunzip
命令。
gzip -d file.txt.gz
-#
:#
是 1 - 9 的数字,用于指定压缩级别,1 为最快(压缩比最低),9 为最慢(压缩比最高),默认是 6。
gzip -9 file.txt
(2) bzip2
bzip2
使用 Burrows - Wheeler 块排序文本压缩算法和霍夫曼编码,通常能提供比 gzip
更高的压缩比,但压缩和解压缩速度相对较慢,压缩后的文件扩展名为 .bz2
。
基本用法:
bzip2 file.txt
此命令会把 file.txt
压缩成 file.txt.bz2
,原文件会被删除。
常用参数:
-k
:保留原始文件。
bzip2 -k file.txt
-d
:解压缩文件,等同于bunzip2
命令。
bzip2 -d file.txt.bz2
-#
:指定压缩级别,范围是 1 - 9,含义与gzip
类似。
bzip2 -9 file.txt
(3) xz
xz
采用 LZMA2 压缩算法,能实现非常高的压缩比,不过压缩和解压缩的时间可能较长,压缩后的文件扩展名为 .xz
。
基本用法:
xz file.txt
该命令会将 file.txt
压缩为 file.txt.xz
,原文件被删除。
常用参数:
-k
:保留原始文件。
xz -k file.txt
-d
:解压缩文件,等同于unxz
命令。
xz -d file.txt.xz
-#
:指定压缩级别,1 - 9 数字,9 为最高压缩比。
xz -9 file.txt
8.2归档命令
(1) tar
tar
是一个用于创建和提取归档文件的工具,它本身不具备压缩功能,但可以与 gzip
、bzip2
、xz
等压缩工具结合使用。
创建归档文件:
tar -cvf archive.tar directory/
-c
:创建新的归档文件。-v
:显示详细的操作过程。-f
:指定归档文件的名称。
结合压缩工具:
- 使用
gzip
压缩:
tar -czvf archive.tar.gz directory/
-z
表示使用 gzip
进行压缩。
- 使用
bzip2
压缩:
tar -cjvf archive.tar.bz2 directory/
-j
表示使用 bzip2
进行压缩。
- 使用
xz
压缩:
tar -cJvf archive.tar.xz directory/
-J
表示使用 xz
进行压缩。
解压缩归档文件:
tar -xvf archive.tar
-x
:从归档文件中提取文件。
对于压缩的归档文件,根据压缩类型使用相应的参数:
tar -xzvf archive.tar.gz
tar -xjvf archive.tar.bz2
tar -xJvf archive.tar.xz
(2) zip
zip
是一个跨平台的压缩工具,可创建 .zip
格式的压缩文件,支持递归压缩目录。
创建压缩文件:
zip -r archive.zip directory/
-r
:递归压缩目录,将目录及其子目录下的所有文件都压缩。
解压缩文件:
unzip archive.zip
(3) rar
rar
用于创建 .rar
格式的压缩文件,在 Linux 系统中需要先安装 rar
工具。
创建压缩文件:
rar a archive.rar directory/
a
:添加文件到压缩包。
解压缩文件:
bash
unrar x archive.rar
x
:解压缩文件并保留原文件的目录结构。
9.脚本调试
9.1 set
命令
set -x
此选项会在执行每一条命令之前,将命令及其参数打印出来,方便查看命令执行的具体情况。
#!/bin/bash
set -x
var=10
echo $var
执行该脚本时,终端会输出每条命令的执行情况,类似如下:
+ var=10
+ echo 10
10
set -v
set -v
会在读取脚本的每一行时将其打印出来,而不是在执行时。它有助于查看脚本的读取流程。
#!/bin/bash
set -v
var=10
echo $var
执行时输出:
var=10
+ var=10
echo $var
+ echo 10
10
set -e
若脚本中的某个命令返回非零退出状态码(表示命令执行失败),set -e
会使脚本立即终止执行,避免错误继续蔓延。
#!/bin/bash
set -e
ls /nonexistent
echo "This line won't be executed if the above command fails."
由于 ls /nonexistent
会失败,脚本会立即退出,不会执行后续的 echo
命令。
9.2 bash -x
在执行脚本时,使用 bash -x
可以在不修改脚本内容的情况下启用调试模式,它和在脚本中使用 set -x
效果类似。
bash -x test_script.sh
9.3 bashdb
bashdb
是一个功能强大的 Bash 调试器,类似于 gdb
对 C 语言的调试功能。
9.4 安装
在大多数 Linux 发行版中,可以使用包管理器进行安装,例如在 Ubuntu 上:
sudo apt-get install bashdb
使用示例
假设有一个脚本 test_script.sh
:
#!/bin/bash
sum=0
for i in {1..5}; do
sum=$((sum + i))
done
echo $sum
使用 bashdb
调试该脚本:
bashdb test_script.sh
进入调试环境后,可以使用以下常用命令:
n
(next
):执行下一行代码。s
(step
):单步执行,遇到函数调用时会进入函数内部。c
(continue
):继续执行脚本,直到下一个断点。b
(break
):设置断点,例如b 5
表示在第 5 行设置断点。
9.5 echo
调试
虽然简单,但 echo
语句在调试中也非常实用。可以在脚本中关键位置添加 echo
语句,输出变量的值或提示信息,以此来查看脚本的执行流程和变量状态。
#!/bin/bash
var=10
echo "The value of var is: $var"
sum=$((var + 5))
echo "The sum is: $sum"
执行脚本时,会输出变量的值,方便调试。