Compare commits

...

8 Commits
main ... main

Author SHA1 Message Date
hmtsai
d59f25f9c0 添加进程的相关内容
Some checks failed
Build and Publish / Run (push) Failing after 6s
2025-01-15 00:20:22 +00:00
hmtsai
d03f30352e 修改部分文章的用词
Some checks failed
Build and Publish / Run (push) Failing after 35s
2025-01-14 22:42:27 +00:00
d7761efacf 更新 src/shell_and_shell_script/loops.md
All checks were successful
Build and Publish / Run (push) Successful in 6m9s
2024-10-02 18:29:26 +08:00
ab84527338 rewrite theme
All checks were successful
Build and Publish / Run (push) Successful in 6m6s
2024-10-02 17:53:16 +08:00
a2af7f9419 更新 src/shell_and_shell_script/loops.md
All checks were successful
Build and Publish / Run (push) Successful in 6m38s
2024-10-02 13:10:37 +08:00
95860dea4d 更新 src/shell_and_shell_script/loops.md
Some checks failed
Build and Publish / Run (push) Has been cancelled
2024-10-02 13:06:04 +08:00
hemingtsai
0d17743272 完成循环
Some checks failed
Build and Publish / Run (push) Has been cancelled
2024-10-02 12:43:38 +08:00
6dbdf4d140 Merge pull request '完成条件判断' (#1) from cxykevin/learn-linux-basic:main into main
All checks were successful
Build and Publish / Run (push) Successful in 7m20s
Reviewed-on: study-area-cn/learn-linux-basic#1
2024-09-19 22:25:02 +08:00
8 changed files with 193 additions and 11 deletions

View File

@ -26,7 +26,7 @@
- [Vim编辑器](./shell_and_shell_script/vim_editor.md)
- [Shell Script基本语法](./shell_and_shell_script/shell_script_basic.md)
- [条件判断语句](./shell_and_shell_script/conditional_judgment.md)
- [循环]()
- [循环](./shell_and_shell_script/loops.md)
- [函数]()
- [at与corntab]()
- [at]()

View File

@ -4,6 +4,8 @@
备份是计算机使用中非常重要的操作。原则上来说,进行任何重大修改(比如更新系统、更新生产环境中的软件。)之前都需要备份。
这个章节主要是让你对备份这个概念有所了解,等到讲解服务器配置及使用的时候我们再仔细学习。
按照备份的范围来分,常用的备份方式有以下几种:
- 全量备份:指把硬盘等存储介质中的所有文件**一次性完整复制**到其他介质上。

View File

@ -2,7 +2,7 @@
## Linux 的文件结构
按照前文,我们所说的 C 盘就是 `/` 了。那么,我们的 D 盘和 E 盘等等呢?它们则被系统放到了别的地方,你甚至可以自定义这些地方(其实 Windows 也可以,不过放得很深),不过一般被放在了 `/mnt``/run/mount` 或者 `/media/你的用户名` 下。(根据发行版和桌面环境的不同有所区别。如果你是安装上文安装的,那么应该在 `/media/你的用户名` 里面)
按照前文,我们所说的 C 盘就是 `/` 了。那么,我们的 D 盘和 E 盘等等呢?它们则被系统放到了别的地方,你甚至可以自定义这些地方,不过一般被放在了 `/mnt``/run/mount` 或者 `/media/你的用户名` 下。(根据发行版和桌面环境的不同有所区别。如果你是安装上文安装的,那么应该在 `/media/你的用户名` 里面)
我们可以使用自带的文件管理器管理文件,就像 Windows 一样。
@ -36,11 +36,9 @@
- `/var/mail` (本地邮件信箱)
- `/var/spool/news` (新闻组)
- `/var/run` (程序相关文件)
- `/var/lock` (程序锁相)
- `/var/lock` (程序锁相)
- `/sys` 也是一个重要的设备目录
- `/home` 用户目录,相当于 `C:\Users`MacOS`/Users`
到这里,相信你已经掌握了 Linux 文件系统的简单结构。
- `/home` 用户目录,相当于 `C:\Users`
---

View File

@ -4,7 +4,7 @@
### 多用户操作系统的概念
不同于Windows这种基本上是单用户的操作系统Linux这种Unix-like系统因为是集成了Unix概念的原因,所以是实打实的多用户多任务分时操作系统。
不同于Windows这种基本上是单用户的操作系统 Linux 这种 Unix-like 操作系统系统由于直接或间接继承了Unix的原因,所以是实打实的多用户多任务分时操作系统。
Unix刚发明的时候电脑十分笨重且昂贵一台电脑不可能让一个用户独占必须同时分给多个用户使用。即便是最基本的电脑也能分出32个终端同时使用。这时候完善的用户与权限的管理就是十分必要的了。
@ -26,7 +26,12 @@ All Users
Unix-like使用UID而不是用户名区分用户如果你试着把两个账户的UID互相调换你会神奇的发现这两个用户的权限和所拥有的文件也被互换了。
UID的各个号段都已经被预先分配好了分配如下- 0 root权限最高的用户 - 1-999 系统服务保留UID下分两种 - 1-200 发行版自带软件所需帐号的UID - 201-999 用户自行创建的或用户所安装软件创建的账户的UID - 1000-60000 普通账户
UID的各个号段都已经被预先分配好了分配如下
- 0 root权限最高的用户
- 1-999 系统服务保留UID下分两种
- 1-200 发行版自带软件所需帐号的UID
- 201-999 用户自行创建的或用户所安装软件创建的账户的UID
- 1000-60000 普通账户
除了root意外其他账户的权限基本没有区别。
@ -54,7 +59,10 @@ vboxadd:x:979:1::/var/run/vboxadd:/bin/false
用户名:密码:UID:GID:其他信息:家目录位置:登录Shell
```
密码字段现在有三种可能性:- `x`表示密码在`/etc/shadow`中 - 留空表示密码为空,无需密码即可登录 - `!`表示该账户已经被禁用,无法登录
密码字段有三种可能性:
- `x`表示密码在`/etc/shadow`中
- 留空表示密码为空,无需密码即可登录
- `!`表示该账户已经被禁用,无法登录
其他信息默认存储用户名,这个也可以存储其他信息,但是现在很少用到。

View File

@ -4,7 +4,7 @@
> 在linux上也有些常见的图形化压缩包管理器比如 `Ark`,但是它们远不及命令行工具的快速和稳定性。
tar压缩包都有一个显著的特征文件名中都带有一个 `.tar`tgz 等部分格式除外),但是后面的 `.gz` 等等又是什么呢其实tar 本身并不是一个压缩格式,它只是简单的把所有文件和文件夹打包到一起,而后面的 `.gz`、`.bz2`、`.xz` 等等才是压缩的格式。
tar压缩包都有一个显著的特征大多数该类型文件的文件名中都带有一个 `.tar`,但是后面的 `.gz` 等等又是什么呢其实tar 本身并不是一个压缩格式,它只是简单的把所有文件和文件夹打包到一起,而后面的 `.gz`、`.bz2`、`.xz` 等等才是压缩的格式。
> 关于其它格式的压缩包,比如`zip`、`rar`等,可以使用其它命令,比如`unzip`、`unrar`等。

View File

@ -156,6 +156,33 @@ Shell 中有一些系统变量,它们在 Shell 启动时自动设置,例如
- `$0`:启动当前终端程序或者 ShellScript 的命令,如 `/bin/bash`
- `$#`:启动当前终端程序或者 ShellScript 的参数个数。
## 进程
在学习上一章节的时候,你是否会疑惑:为什么执行一个新的 Shell 就可以在一个不影响原本 Shell 的环境中工作呢?
实际上我们在执行一个命令的时候Shell 会为这个程序开启一个新进程。那什么叫做进程呢?你可以把它理解为你给计算机派发的一个任务。你只需要派发任务就好了,而计算机要考虑的事情就多了。(划掉)计算机负责执行这个进程,操作系统给它分配系统资源。
我们每个人都有自己的父母,进程也是一样。例如,进程 A 启动了进程 B那么进程 A 就是进程 B 的父进程(也可以称之为母进程)。
一般情况下,进程的环境变量只能向下传递。也就是当父进程启动了一个子进程的时候,子进程会继承父进程的环境变量。但是这时集成的只是父进程在创建子进程时环境变量的一个快照,以后父进程中环境变量更新的时候不会影响子进程。
我们可以通过实例来了解一下这个问题。
```sh
$ export TEST=114514
$ echo $TEST
114514
$ bash # 启动一个新的 Shell 进程
$ echo $TEST
114514 # 从父进程那里继承了环境变量
$ export TEST=1919810 # 尝试修改变量
$ echo $TEST
1919810
$ exit # 回到父进程
$ echo $TEST
114514 # 父进程的环境变量没有被改变
```
## 管道
Shell 中的管道是链接两个命令的方式,管道遵守下面的格式。

View File

@ -0,0 +1,146 @@
# 循环
我相信你一定听说过循环这个词,循环可以让我们重复执行一段代码,帮助我们完成一些重复的工作。循环也有许多的类型,有可以一直持续下去的,也可以就执行几次。
那么在 Shell Script 中,我们可以使用以下几种循环结构:
- `for-in`: 依次循环某个数组中的每个元素。
- `for`:可以方便的从一个数走到另一个数,当然不止这一种用法。
- `while`: 在条件为真时,重复执行一段代码。
- `until`: 在条件为假时,重复执行一段代码。
接下来就让我们逐一讲解这些循环结构吧。
## 数组
数组是 Shell Script 中的一种数据结构。数组在 sh 上并不存在,你需要使用 bash。它可以存储多个值并且可以通过数字索引来访问这些值。
> 在 zsh 等 Shell 中,数组的行为并不总是一样的。下文均使用 bash。
在 Shell Script 中,我们可以使用以下语法来定义一个数组:
```bash
array=("value1" "value2" "value3")
```
数组中的元素都拥有一个唯一的索引,索引从 0 开始。我们可以使用下面的方法来访问数组中的元素:
```bash
${array[0]}
```
这将会返回 array 数组中的第一个元素,即 `value1`
## `for-in` 循环
`for-in` 循环是 Shell Script 中最常用的循环结构之一,它允许我们依次循环某个数组中的每个元素。以下是一个简单的 for-in 循环示例:
```bash
for variable in array
do
你的代码
done
```
在这个示例中variable 是循环变量array 是要循环的数组。在每次循环中variable 都会按顺序被赋值为 array 中的一个元素,然后执行你的代码。当 array 中的所有元素都被循环完毕后,循环结束。
这里 array 除了可以放数组之外,也可以放字符串(按行遍历)和范围语句。
范围语句的格式如下:
```bash
{起点..终点}
{起点..终点..步长}
```
> 在 bash 中,起点可以大于终点,但是步长要为正数。并且起点和终点都会被遍历
例如:
```bash
for num in {1..10}
do
echo $num
done
```
会输出从 1 到 10。
> 在范围语句内不能加变量,如果需要使用变量请往下看。
## `for` 循环
for 循环是 Shell Script 中另一种常用的循环结构它允许我们使用初始化、判断条件、迭代语句来控制循环的执行。以下是一个简单的for循环示例
```bash
for ((初始化语句; 你的条件; 迭代语句))
do
你的代码
done
```
在这个例子中,初始化语句会被执行,然后执行一次判断语句。如果判断语句的结果为真,那么就会进行一次循环。当你的代码运行完毕后,会执行一次迭代语句,然后再回去执行判断。
例如:
```bash
for ((i=1; i<=10; i++))
do
echo $i
done
```
就对应了 `{1..10..1}` 的结果。
> 这里表达式和方括号有区别,不能使用 `-lt` 一类的符号。可以使用:`==`、`>=`、`<=`、`!=`。
>
> 而后面的 `i++` 中,可以使用 `--`,也可以使用 `+=`、`-=`、`*=`、`/=` 后面加一个数字。
## `while` 循环
`while` 循环允许我们在某个条件为真时,重复执行一段代码。以下是一个简单的示例:
```bash
while 条件
do
你的代码
done
```
while 循环就相当于一个 for 循环,但是没有了初始化和迭代语句。如果你在条件的位置写上了 `true`,那么它会永无休止的执行下去,除非你手动停止。
> while 中的条件需要使用方括号。
例如:
```bash
i=1
while [ $i -le 10 ]
do
echo $i
i=$[ $i + 1 ]
done
```
和上面 for 的版本是一样的。
## `until` 循环
`until` 循环刚好与 while 循环相反,它允许我们在某个条件为假时,重复执行一段代码。以下是一个简单的 until 循环示例:
```bash
until 你的条件
do
你的代码
done
```
until 因为 和 while 十分相似,这里就不过多解释了。
until 循环常常被用于多次尝试的场景下,例如尝试连接到一个远程服务器,直到连接成功为止。
## 课后作业
- 使用 for 循环制作一个程序,这个程序读取一个正整数 N并输出 2^N 的值(提示:只需要让变量从 1 开始,每次乘 2 即可)。
- 使用 while 循环制作一个猜数字游戏,程序会随机生成一个 1 到 100 之间的整数,玩家需要猜出这个数字是多少,程序会根据玩家的猜测给出猜大了或者猜小了的提示,直到玩家猜对为止(提示:生成随机数可以使用 `$[ $RANDOM % 99 + 1 ]`,其中 `$RANDOM` 是一个 0~32767 的随机整数)。
- 使用 for-in 循环制作一个程序,该程序读取一个列表,并挨个输出它的所有元素。

View File

@ -10,7 +10,8 @@
>
> Shell 也指代一种命令语言,由这种语言编写的脚本称为 Shell Script。
上面的内容有些难懂,你不妨可以理解为 Shell 就是用户的命令与 Kernel 之间的“桥梁”。
如果你听不太懂的话,你可以简单的把 Shell 理解为内核的秘书。秘书主要干什么?就是帮助老板安排会议、与他人沟通的嘛。
## Shell 有哪些