Bash for Begginners
Bash Basic
Shell 和 Terminal有什么区别
Shell:
- Shell 是用户与操作系统交互的接口,特别是在类Unix系统中(比如Linux和macOS)。
- 它是一个命令行解释器,提供了一个命令行用户界面,用户可以在其中输入命令,Shell 会解释这些命令并调用操作系统来执行。
- Shell 有许多不同的变种,包括 Bourne Shell (sh), Bourne Again Shell (bash), C Shell (csh), Korn Shell (ksh), Z Shell (zsh) 等。
- Shell 也可以提供编程的功能,比如变量、控制结构(if-then-else, loops)、函数等。
Terminal:
- Terminal,有时被称为终端模拟器,是一个软件程序,用来模拟早期的硬件终端。
- 它是一个环境,用户可以在其中使用Shell。你可以在Terminal中启动一个Shell会话,输入命令,看到命令的输出。
- Terminal 程序捕获用户的输入并将其发送到Shell,同时将Shell的输出显示给用户。
- 现代的操作系统,如Windows、macOS和Linux,通常都有自己的终端模拟器程序,比如macOS的Terminal.app,Linux的gnome-terminal、konsole等,Windows的Command Prompt和PowerShell等。
简单来说,Shell 是用来解释和执行命令的程序,而 Terminal 是用来与 Shell 交互的界面。在日常使用中,术语 “打开一个终端” 通常意味着启动一个终端程序并在其中运行一个Shell。
学习Bash的原因
当你遇见一些需要同时操作许多不同文件的情况或场景的时候,Bash远远会比其他编程语言执行的要快和简单
Bash有很多内建命令,例如cp,mv,rm,grep,find等,这些命令可以直接在命令行中使用,非常适合进行文件操作和文本处理
Bash支持管道|和重定向>>,>,< 能够将一个命令的输出非常容易地转换成另一个命令地输入,以此来创建复杂的命令链。
Bash可以使用通配符,如*或者?和正则表达式来匹配文件名或文本模式,这在处理多个文件时,非常有用。
Bash直接运行在操作系统中,不需要额外的运行时环境或虚拟机。意味着它可以直接访问系统资源和工具。
Bash能够允许用户编写复杂的自动化脚本来执行一系列命令,无需编译。
6.最后一点,Bash直接余操作系统的内核交互,是没有额外的抽象层。
Bash for Beginners
快速入门
基础命令
学Bash最好的办法就是不要离开你的Terimnal
- 能够帮你学习命令的一个命令 help
- 能够帮助你学习的第二个命令man
pwd和cd
cd的底层逻辑不是记录你去过的地方,而是用一个栈来对你的目录进行推入和弹出
tree和ls
- pushd和popd,dirs
在Bash中,pushd
和 popd
是用来操作目录栈的内建命令,它们与 dirs
命令一起工作,以帮助你在不同的目录之间快速地切换。
pushd 命令
pushd
命令用于将一个目录添加到目录栈的顶部,并且将你的当前工作目录切换到那个目录。这对于临时切换到另一个目录,执行一些操作,然后返回到原始目录非常有用。
使用方法如下:
pushd /path/to/new/directory |
这个命令会将 /path/to/new/directory
放入目录栈,并且把当前工作目录切换到这个新目录。
popd 命令
popd
命令用于从目录栈中移除顶部的目录,并将当前工作目录切换到新的栈顶目录。
使用方法如下:
popd |
执行这个命令后,栈顶的目录将被移除,你的当前工作目录将变为之前通过 pushd
添加的下一个目录。
dirs 命令
dirs
命令用于显示当前目录栈的内容,即你用 pushd
添加的所有目录列表。
使用方法如下:
dirs |
这个命令会列出目录栈中的所有目录,通常以空格分隔。
示例
下面是一个使用 pushd
和 popd
的简单示例:
# 假设当前目录是 /home/user |
使用 pushd
和 popd
可以让你在多个工作目录之间快速切换,而无需手动输入 cd
命令和目录路径。这在编写脚本或进行复杂的文件系统操作时尤其有用。
whereis
find
Redirection
标准输出重定向 (>
和 >>
)
使用 >
重定向标准输出
当你想把命令的输出保存到一个文件中时,可以使用 >
操作符。例如:
echo "Hello, World!" > hello.txt |
这条命令会创建(或覆盖)一个名为 hello.txt
的文件,并将 echo
命令的输出写入该文件。
使用 >>
追加到文件
如果你不想覆盖文件中现有的内容,而是想追加内容,可以使用 >>
操作符。例如:
echo "Another line" >> hello.txt |
这会将 “Another line” 追加到 hello.txt
文件的末尾。
标准输入重定向 (<
)
使用 <
重定向标准输入
<
操作符用于将文件内容作为命令的输入。例如,如果你有一个名为 commands.txt
的文件,包含一系列命令,你可以使用:
bash < commands.txt |
这条命令会执行 commands.txt
文件中的 Bash 命令。
组合输入和输出重定向
你还可以组合使用输入和输出重定向。例如,以下命令将 input.txt
文件中的内容作为 sort
命令的输入,并将结果输出到 output.txt
:
sort < input.txt > output.txt |
标准错误重定向 (2>
)
重定向标准错误
在 Bash 中,标准错误(stderr)是一个单独的输出流,用于输出错误信息。使用 2>
可以重定向错误信息到一个文件。例如:
ls non_existent_file 2> error.log |
如果 non_existent_file
不存在,ls
命令的错误信息会被写入到 error.log
。
结合标准输出和标准错误重定向
有时你可能想同时重定向标准输出和标准错误到同一个文件。这可以通过以下方式实现:
command > output_and_error.log 2>&1 |
这条命令将 command
的标准输出和标准错误都重定向到 output_and_error.log
文件。
当然可以。以下是一篇关于如何使用 Bash 更新服务器操作系统的知识点总结的博客草稿,采用 Markdown 格式编写:
Bash 更新服务器操作系统
在服务器管理中,定期更新操作系统是一项重要的维护任务。使用 Bash 脚本可以简化这一过程。在本文中,我们将探讨如何使用 Bash 命令来更新服务器的操作系统。
1. 理解 Bash 和 Shell
首先,了解 Bash 和 Shell 的基本概念是很重要的。Bash(Bourne Again SHell)是一种流行的命令行界面和脚本语言,用于与操作系统交互。
2. 检查更新
在更新之前,你应该检查是否有可用的更新。这通常可以通过以下命令完成:
sudo apt-get update |
这个命令会同步包数据库,并列出可用的更新。
3. 安装更新
一旦检查了可用的更新,下一步就是安装它们。这可以通过以下命令完成:
sudo apt-get upgrade |
此命令会下载并安装更新。请注意,这可能需要一些时间,具体取决于更新的大小和数量。
4. 清理不必要的包
更新后,可能会有一些不再需要的包留在系统上。运行以下命令可以清理这些包:
sudo apt-get autoremove |
5. 重启服务器
某些更新(特别是内核更新)可能需要重启服务器才能生效。可以使用以下命令来安全地重启服务器:
sudo reboot |
当然可以。下面是一篇使用 Markdown 编写的关于如何使用 Bash 查找和终止异常或不需要的进程的博客文章。
Bash 查找和终止异常或不需要的进程
在日常的系统管理和运维工作中,经常需要处理运行中的异常或不需要的进程。使用 Bash,我们可以有效地识别这些进程并安全地终止它们。本文将介绍如何使用 Bash 来查找和终止这些进程。
查找进程
要查找正在运行的进程,最常用的命令是 ps
和 top
。
使用 ps
命令
ps
命令可以显示当前系统中活动的进程。常见用法如下:
ps aux |
这个命令会列出所有运行中的进程及其详细信息,包括进程 ID、CPU 和内存使用率等。
使用 top
命令
另一个有用的工具是 top
,它提供了一个实时更新的进程列表,类似于 Windows 中的任务管理器:
top |
通过 top
,可以实时观察进程的状态和系统资源的使用情况。
终止进程
一旦识别出需要终止的进程,可以使用 kill
命令来终止它们。
使用 kill
命令
要终止一个进程,首先需要知道它的进程 ID(PID)。使用 kill
命令后跟 PID 可以发送信号来终止进程:
kill [PID] |
如果进程不响应普通的 kill
命令,可以使用 -9
选项强制终止:
kill -9 [PID] |
使用 pkill
和 killall
如果你知道进程的名称而不是 PID,可以使用 pkill
或 killall
:
pkill [进程名] |
Bash脚本基础
Bash 脚本是 Linux 和 Unix 系统中自动化任务和管理系统的强大工具。本教程将介绍 Bash 脚本的基本概念,包括脚本的定义、使用原因、格式、权限设置,以及如何将脚本添加到 PATH 目录中。
什么是 Bash 脚本?
Bash 脚本是一系列在 Bash shell 中执行的命令集合。它们被编写在文本文件中,可被 Bash 直接执行。
为什么使用 Bash 脚本?
使用 Bash 脚本可以自动化复杂的、重复的任务,提高效率并减少人为错误。它们在系统管理、程序开发和数据处理等领域非常有用。
脚本格式
一个基本的 Bash 脚本格式如下:
|
好的,下面我会详细地介绍 Bash 脚本的基本语法和一些关键概念。
1. 脚本结构
Shebang(#!):每个 Bash 脚本通常以
#!
开头,后面跟着解释器的路径。对于 Bash 脚本,这行通常是#!/bin/bash
。注释:使用
#
开头的行是注释,不会被执行。# 这是一条注释
2. 变量
声明变量:在 Bash 中,你可以通过简单地赋值来声明变量。不需要使用任何关键字。
name="张三"
使用变量:使用
$
符号来引用变量的值。echo $name
3. 命令执行
执行命令:Bash 脚本中的命令和你在命令行中输入的命令一样。
ls -l
4. 控制结构
条件语句(if-else):用于根据条件执行不同的代码块。
if [ $name == "张三" ]; then
echo "名字是张三"
else
echo "名字不是张三"
fi循环(for, while):用于重复执行一段代码。
for i in {1..5}; do
echo "这是第 $i 次"
done或者
i=1
while [ $i -le 5 ]; do
echo "这是第 $i 次"
i=$((i + 1))
done
5. 函数
定义函数:函数可以帮助组织和复用代码。
function greet() {
echo "你好, $1"
}调用函数:调用函数并传递参数。
greet "张三"
6. 输入输出
读取输入:使用
read
命令读取用户输入。echo "请输入你的名字:"
read name
echo "你好, $name"输出重定向:使用
>
和>>
将输出重定向到文件。echo "这是一条消息" > file.txt # 覆盖文件
echo "这是另一条消息" >> file.txt # 追加到文件
7. 特殊变量
**$0, $1, $2, …**:这些特殊变量用于访问脚本的参数。
$0
是脚本名,$1
是第一个参数,依此类推。**$#**:参数的数量。
$@ 和 **$***:所有参数的列表。
$@
在双引号中使用时,每个参数都是独立的,而$*
将所有参数视为单个字符串。
8. 退出状态
退出状态:每个命令执行完毕后都会返回一个退出状态。成功的命令返回 0,失败的命令返回非零值。
command
echo $? # 显示上一个命令的退出状态
命令大全
5.1运行级别
基本
0 | 关机 | |
---|---|---|
1 | 单用户(找回丢失密码) | |
2 | 多用户状态没有网络服务 | |
3 | 系统未使用保留给用户 | multi-user.target |
4 | 图形界面 | |
5 | 系统重启 | graphical.target |
==Note==
常用系统级别是3和5,也可以切换运行级别和指定默认运行级别。
切换运行级别
Order | illustrate |
---|---|
init 运行级别(init 3) | 将运行级别切换为3(多用户状态有网络服务) |
==Note==
init 只能用来切换运行级别。下次开机后系统自动回到运行级别5。
设置默认运行级别
Order | illustrate |
---|---|
systemctl get-default | 查看当前默认运行级别 |
systemctl set-default multi-user.target | 设置默认运行级别为3 |
systemctl set -default graphical.target | 设置默认运行级别为5 |
==Note==
-此方式永久性的修改了默认运行级别。每次开机后系统都会运行该默认运行级别。
开机流程说明
帮助指令
Order | illustrate |
---|---|
man 命令或配置文件 | 获得命令或配置文件的帮助信息 |
help 命令 | 获得shell内置命令的帮助信息 |
文件目录类
pwd指令
Order | illustrate |
---|---|
pwd | 显示当前工作目录的绝对途径 |
ls指令
Order | illustrate |
---|---|
ls 目录或文件 | 显示当前目录下所有的文件和目录(不包括隐藏的) |
ls -a 目录或文件 | 显示当前目录下所有的文件和目录(包括隐藏的) |
ls -l 目录或文件 或 ll 目录或文件 | 以列表的方式显示信息 |
ls -lh 目录或文件 | 以列表的方式人性化地显示信息 |
cd指令
Order | illustrate |
---|---|
cd | 切换到当前用户的家目录 |
cd ~ | 切换到当前用户的家目录 |
cd . | 保持当前目录不变 |
cd .. | 切换到上级目录 |
cd - | 可以在最近两次工作目录之间来回切换 |
mkdir指令
Order | illustrate |
---|---|
mkdir 要创建的单级目录 | 创建单级目录 |
mkdir -p 要创建的多级目录 | 创建多级目录 |
rmdir指令
Order | illustrate |
---|---|
rmdir 要删除的空目录 | 删除空目录 |
rm -rf 要删除的非空目录 | 删除非空目录 |
touch指令
Order | illustrate |
---|---|
touch 文件名称 | 创建一个空文件 |
cp指令
Order | illustrate | Remake |
---|---|---|
cp source dest | 将source拷贝到dest | |
cp -r source dest | 将source递归拷贝到dest | |
\cp source dest | 将source拷贝到dest(强制覆盖不提示) |
rm指令
Order | illustrate |
---|---|
rm 要删除的文件或目录 | 移除文件或目录 |
rm -r 要删除的目录 | 递归删除目录 |
rm -f 要删除的文件或目录 | 强制删除目录不提示 |
mv指令
Order | illustrate |
---|---|
mv oldFileName newFileName | 重命名(两者在同一目录下面) |
mv /temp/movefile /targetFolder | 移动文件 |
cat指令
Order | illustrate |
---|---|
cat 要查看的文件 | 查看文件的内容 |
cat -n 要查看的文件 | 查看文件的内容并显示行号 |
cat -n 要查看的文件 more | 将cat查看的内容交给more指令来处理(为了浏览方便) |
more指令
|Order|illustrate|
|—–|—–|
|more 要查看的文件|查看文件的内容(浏览更方便)|
less指令
Order | illustrate |
---|---|
less 要查看的文件 | 查看文件的内容 |
==Note==
less 指令用来分屏查看文件内容,它的功能与more 指令类似,但是比 more 指令更加强大,支持各种显示终端。less指令在显示文件内容时,并不是一次将整个文件加载之后才显示,而是根据显示需要加载内容,对于显示大型文件具有较高的效率。
echo指令
Order | illustrate |
---|---|
echo $PATH | 输出当前PATH环境变量 |
echo $HOSTNAME | 输出当前HOSTNAME环境变量(主机名) |
echo ‘hello world’ | 输出hello world |
head指令
==head指令用于查看文件开头的部分内容(默认情况下显示前10行)。==
|Order|illustrate|
|—–|—–|
|head 文件|查看文件开头的前10行内容|
|head -n 5 文件|查看文件开头的前5行内容|
tail指令
Order | illustrate |
---|---|
tail 文件 | 查看文件尾部的后10行内容 |
tail -n 5 文件 | 查看文件尾部的后5行内容 |
tail -f 文件 | 实时追踪该文档的所有更新 |
>指令和>>指令
Order | illustrate |
---|---|
ls -l > 文件 | 列表的内容写入(覆盖)到文件 |
ls -l >> 文件 | 列表的内容追加到文件 |
cat 文件1 > 文件2 | 文件1的内容覆盖到文件2 |
echo ‘hello’ >> 文件 | hello追加到文件中 |
In指令
Order | illustrate |
---|---|
ln -s 原文件或目录 软链接名 | 给原文件创建一个软链接(这样软链接就指向了原文件或目录) |
==Note==
当工作目录为软链接所在目录,使用pwd查看的目录仍然是软链接所在目录而不是原目录。
history指令
==history指令用于查看已经执行过的历史命令。==
Order | illustrate |
---|---|
histrory | 查看已经执行过的历史命令 |
histrory n | 查看最近执行过的n条历史命令 |
!n | 执行历史编号为n的历史命令 |
时间日期类
date指令
date指令用于显示当前日期
|Order|illustrate|
|—–|—–|
|date|显示当前时间|
|date +%Y|显示当前年份|
|date +%m|显示当前月份|
|date +%d|显示当前是哪一天|
|date “+%Y-%m-%d %H:%M:%S”|显示年月日时分秒|
设置时间
Order | illustrate |
---|---|
date -s 字符串时间 | 设置系统当前时间 |
cal指令
cal指令用于显示日历
|Order|illustrate|
|—–|—–|
|cal|显示本月日历|
|cal 年份|显示本年所有月日历|
搜索查找类
find指令
Order | illustrate |
---|---|
find 指定目录 -name 要查找的文件或目录 | 按照指定目录查询文件或目录 |
find 指定目录 -user 用户名 | 按照指定目录查找指定用户名的所有文件或目录 |
find 指定目录 -size 文件大小 | 按照指定目录查找满足文件大小的所有文件或目录 |
==Note==
1.文件大小:大于+,小于-,等于=
2.find指令将从指定目录向下递归地遍历其各个子目录,将满足条件的文件或者目录显示在终端。
find指令也可以不指定目录进行查找。
locate指令
Order | illustrate |
---|---|
locate 要查找的文件或目录 | 快速查找文件或目录 |
==Note== | |
1.locate指令无需遍历整个文件系统,locate 指令利用事先建立的系统中所有文件名称及路径的 locate数据库实现快速定位给定的文件路径。 |
2.为了保证查询结果的准确度,管理员必须定期更新locate时刻。
3.由于locate指令基于数据库进行查询,所以第一次运行前,必须使用updatedb指令创建locatc数据库。
which指令
Order | illustrate |
---|---|
which 要查找的命令 | 查找指令的存放路径 |
==Note==
which指令用于查找指令的存放路径。
管道符“|”和grep指令
Order | illustrate |
---|---|
grep 查找内容 源文件 | 将源文件中的查找内容输出 |
grep -n 查找内容 源文件 | 将源文件中的查找内容输出,并显示行号 |
grep -i 查找内容 源文件 | 将源文件中的查找内容输出(不区分大小写) |
==Note==
1.管道符“|”表示将前一个命令的处理结果输出传递给后面的命令处理。
grep指令用于过滤查找,可配合管道符“|”使用。
==Case study
请在 hello.txt文件中,查找”yes”所在行,并且显示行号。
法一:cat hello.txt | grep -n “yes”
法二:grep -n “yes” hello.txt
压缩和解压
gzip/gunzio指令
Order | illustrate |
---|---|
gzip 文件 | 压缩文件(只能将文件压缩为*.gz文件) |
gunzip 文件.gz | 解压缩文件 |
==zip/unzip指令==
Order | illustrate |
---|---|
zip XXX.zip 要压缩的文件 | 压缩文件 |
zip -r XXX.zip 要压缩的目录 | 压缩目录(递归压缩) |
unzip XXX.zip | 将压缩包解压到当前目录下 |
unzip -d 目标目录 XXX.zip | 将压缩包解压到指定目录下 |
==tar指令==
Order | illustrate |
---|---|
tar-z | 压缩/解压缩 |
tar-c | 产生tar打包文件 |
tar-v | 显示详细信息 |
tar-f | 指定压缩后的文件名 |
tar-x | 解包.tar文件 |
tar-C | 解压缩到指定目录(解压缩的目录必须存在) |
tar -zcvf 打包文件.tar.gz 被打包的文件 | 打包压缩文件 |
tar -zxvf 打包文件.tar.gz | 解包解压缩文件至当前目录下 |
tar -zxvf 打包文件.tar.gz -C 目标目录 | 解包解压缩文件至当前指定目录下 |
Bash组基本介绍
Bash组基本介绍**
在Bash中的每个用户必须属于一个组,且可以改变每个用户所在的组。
在Bash中的每个文件拥有以下概念:
1.所有者2.所在组3.其它组
文件/目录所有者
一般为文件/目录的创建者,即谁创建文件/目录,谁就是该文件/目录的所有者。
查看文件/目录的所有者
ls -alh
修改文件/目录的所有者
Order | illustrate |
---|---|
chown 所有者 文件/目录 | 修改文件/目录的所有者 |
chown -R 所有者 目录 | 递归修改目录及目录内容的所有者 |
chown 所有者:所在组 文件/目录 | 修改文件/目录的所有者和所在组 |
文件/目录所在组
当某个用户创建了一个文件后,这个文件的所在组就是该用户所在的组(默认)。
查看文件/目录的所在组
ls -alh
修改文件/目录的所在组
Order | illustrate |
---|---|
chgrp 所在组 文件/目录 | 修改文件/目录的所在组 |
chgrp -R 所在组 目录 | 递归修改目录及目录内容的所在组 |
其它组
除文件的所有者和所在组的用户外,系统的其它用户都属于文件的其它组。
权限管理
基本介绍
0-9位说明
1.第0位确定文件类型(-、l、d、c、b)
-表示普通文件
l是链接,相当于windows的快捷方式
d是目录,相当于windows的文件夹
c是字符设备文件,例如鼠标,键盘
b是块设备,例如硬盘
2.第1-3位确定该文件所有者拥有的权限。
3.第4-6位确定与该文件所有者同一组的用户拥有的权限。
4.第7-9位确定不与该文件所有者同一组的其他用户拥有的权限。
rwx作用到文件
r表示可读(read):可以查看文件中的内容
w表示可写(write):可以修改文件中的内容,但是不一定可以删除该文件(因为删除一个 文件的前提是对该文件所在目录有写权限,才能删除该文件)
x表示可执行(execute):可以执行该文件
rwx作用到目录
1.r表示可读(read):可以查看目录中的内容(ls查看)
2.w表示可写(write):可以创建、删除目录中的内容,重命名目录
3.x表示可执行(execute):可以进入该目录(cd进入)
ls -l扩展
ls -l可显示目录下文件的详细信息,从左往右依次是:
文件类型
权限
硬链接数(对于文件来说)或子目录数(对于目录来说,包括隐藏目录)
用户
组
文件/文件夹大小(字节)
最后修改日期
文件名
chmod
chmod指令用于修改文件或者目录的权限。
+、-、=变更权限
|Order|illustrate|
|—–|—–|
|chmod u=rwx,g=rx,o=x 文件/目录|给文件/目录的所有者读写执行的权限,所在组读执行的权限其它组执行的权限 |
|chmod o+x 文件/目录|给文件/目录的其它组增加执行的权限|
|chmod a-x 文件/目录|给文件/目录的所有人除去执行的权限|
Remake | —– |
---|---|
u: | 所有者 |
g: | 所在组 |
o: | 其它组 |
a: | 所有人 |
=: | 赋予 |
+: | 增加 |
-: | 除去 |
数字变更权限
Order | illustrate |
---|---|
chmod 751 文件/目录 | 给文件/目录的所有者读写执行的权限,所在组读执行的权限,其它组执行的权限 |
定时任务调度
crond任务调度
1.任务调度:系统在某个时间执行的特定命令或者程序。
2.任务调度分类:
(1).系统工作:有些重要的工作必须周而复始的执行
(2).个别用户工作:个别用户可能希望执行某些程序