Bash Basic

Shell 和 Terminal有什么区别

  1. 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)、函数等。
  2. 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远远会比其他编程语言执行的要快和简单

  1. Bash有很多内建命令,例如cp,mv,rm,grep,find等,这些命令可以直接在命令行中使用,非常适合进行文件操作和文本处理

  2. Bash支持管道|和重定向>>,>,< 能够将一个命令的输出非常容易地转换成另一个命令地输入,以此来创建复杂的命令链。

  3. Bash可以使用通配符,如*或者?和正则表达式来匹配文件名或文本模式,这在处理多个文件时,非常有用。

  4. Bash直接运行在操作系统中,不需要额外的运行时环境或虚拟机。意味着它可以直接访问系统资源和工具。

  5. Bash能够允许用户编写复杂的自动化脚本来执行一系列命令,无需编译。

6.最后一点,Bash直接余操作系统的内核交互,是没有额外的抽象层。

Bash for Beginners

image-20231122144022802

快速入门

image-20231122145006070

基础命令

学Bash最好的办法就是不要离开你的Terimnal

  1. 能够帮你学习命令的一个命令 help

image-20231122145704095

  1. 能够帮助你学习的第二个命令man

image-20231122150215508

  1. pwd和cd

    cd的底层逻辑不是记录你去过的地方,而是用一个栈来对你的目录进行推入和弹出

    image-20231122151730947

  2. tree和ls

image-20231122152044955

  1. pushd和popd,dirs

在Bash中,pushdpopd 是用来操作目录栈的内建命令,它们与 dirs 命令一起工作,以帮助你在不同的目录之间快速地切换。

pushd 命令

pushd 命令用于将一个目录添加到目录栈的顶部,并且将你的当前工作目录切换到那个目录。这对于临时切换到另一个目录,执行一些操作,然后返回到原始目录非常有用。

使用方法如下:

pushd /path/to/new/directory

这个命令会将 /path/to/new/directory 放入目录栈,并且把当前工作目录切换到这个新目录。

popd 命令

popd 命令用于从目录栈中移除顶部的目录,并将当前工作目录切换到新的栈顶目录。

使用方法如下:

popd

执行这个命令后,栈顶的目录将被移除,你的当前工作目录将变为之前通过 pushd 添加的下一个目录。

dirs 命令

dirs 命令用于显示当前目录栈的内容,即你用 pushd 添加的所有目录列表。

使用方法如下:

dirs

这个命令会列出目录栈中的所有目录,通常以空格分隔。

示例

下面是一个使用 pushdpopd 的简单示例:

# 假设当前目录是 /home/user
pushd /var/www # 将 /var/www 添加到目录栈并切换到该目录
# 现在当前目录是 /var/www
pushd /etc # 将 /etc 添加到目录栈并切换到该目录
# 现在当前目录是 /etc
dirs # 显示目录栈内容
# 输出可能是 /etc /var/www /home/user
popd # 移除栈顶目录 (/etc) 并切换到下一个目录 (/var/www)
# 现在当前目录是 /var/www
popd # 移除栈顶目录 (/var/www) 并切换到下一个目录 (/home/user)
# 现在当前目录是 /home/user

使用 pushdpopd 可以让你在多个工作目录之间快速切换,而无需手动输入 cd 命令和目录路径。这在编写脚本或进行复杂的文件系统操作时尤其有用。

image-20231122152543455

whereis

image-20231122201845965

find

image-20231122202023427

Redirection

image-20231122203644825

image-20231122204052818

标准输出重定向 (>>>)

使用 > 重定向标准输出

当你想把命令的输出保存到一个文件中时,可以使用 > 操作符。例如:

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 来查找和终止这些进程。

查找进程

要查找正在运行的进程,最常用的命令是 pstop

使用 ps 命令

ps 命令可以显示当前系统中活动的进程。常见用法如下:

ps aux

这个命令会列出所有运行中的进程及其详细信息,包括进程 ID、CPU 和内存使用率等。

使用 top 命令

另一个有用的工具是 top,它提供了一个实时更新的进程列表,类似于 Windows 中的任务管理器:

top

通过 top,可以实时观察进程的状态和系统资源的使用情况。

终止进程

一旦识别出需要终止的进程,可以使用 kill 命令来终止它们。

使用 kill 命令

要终止一个进程,首先需要知道它的进程 ID(PID)。使用 kill 命令后跟 PID 可以发送信号来终止进程:

kill [PID]

如果进程不响应普通的 kill 命令,可以使用 -9 选项强制终止:

kill -9 [PID]
使用 pkillkillall

如果你知道进程的名称而不是 PID,可以使用 pkillkillall

pkill [进程名]
killall [进程名]

Bash脚本基础

Bash 脚本是 Linux 和 Unix 系统中自动化任务和管理系统的强大工具。本教程将介绍 Bash 脚本的基本概念,包括脚本的定义、使用原因、格式、权限设置,以及如何将脚本添加到 PATH 目录中。

什么是 Bash 脚本?

Bash 脚本是一系列在 Bash shell 中执行的命令集合。它们被编写在文本文件中,可被 Bash 直接执行。

为什么使用 Bash 脚本?

使用 Bash 脚本可以自动化复杂的、重复的任务,提高效率并减少人为错误。它们在系统管理、程序开发和数据处理等领域非常有用。

脚本格式

一个基本的 Bash 脚本格式如下:

#!/bin/bash
# 这里是注释
echo "Hello World!"

好的,下面我会详细地介绍 Bash 脚本的基本语法和一些关键概念。

1. 脚本结构

  • Shebang(#!):每个 Bash 脚本通常以 #! 开头,后面跟着解释器的路径。对于 Bash 脚本,这行通常是 #!/bin/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==
-此方式永久性的修改了默认运行级别。每次开机后系统都会运行该默认运行级别。

开机流程说明

img

帮助指令

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指令

img
|Order|illustrate|
|—–|—–|
|more 要查看的文件|查看文件的内容(浏览更方便)|

less指令

Order illustrate
less 要查看的文件 查看文件的内容

==Note==
less 指令用来分屏查看文件内容,它的功能与more 指令类似,但是比 more 指令更加强大,支持各种显示终端。less指令在显示文件内容时,并不是一次将整个文件加载之后才显示,而是根据显示需要加载内容,对于显示大型文件具有较高的效率。

img

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

img

修改文件/目录的所有者

Order illustrate
chown 所有者 文件/目录 修改文件/目录的所有者
chown -R 所有者 目录 递归修改目录及目录内容的所有者
chown 所有者:所在组 文件/目录 修改文件/目录的所有者和所在组

文件/目录所在组

当某个用户创建了一个文件后,这个文件的所在组就是该用户所在的组(默认)。

查看文件/目录的所在组

ls -alh

img

修改文件/目录的所在组

Order illustrate
chgrp 所在组 文件/目录 修改文件/目录的所在组
chgrp -R 所在组 目录 递归修改目录及目录内容的所在组

其它组

除文件的所有者和所在组的用户外,系统的其它用户都属于文件的其它组。

权限管理

基本介绍

img

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扩展

img

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).个别用户工作:个别用户可能希望执行某些程序

img