From 0d17743272681d07659d3ccea10676bb9703d89c Mon Sep 17 00:00:00 2001 From: hemingtsai Date: Wed, 2 Oct 2024 12:43:38 +0800 Subject: [PATCH 1/5] =?UTF-8?q?=E5=AE=8C=E6=88=90=E5=BE=AA=E7=8E=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/SUMMARY.md | 2 +- src/shell_and_shell_script/loops.md | 86 +++++++++++++++++++++++++++++ theme | 2 +- 3 files changed, 88 insertions(+), 2 deletions(-) create mode 100644 src/shell_and_shell_script/loops.md diff --git a/src/SUMMARY.md b/src/SUMMARY.md index ac95395..e3690a5 100755 --- a/src/SUMMARY.md +++ b/src/SUMMARY.md @@ -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]() diff --git a/src/shell_and_shell_script/loops.md b/src/shell_and_shell_script/loops.md new file mode 100644 index 0000000..cf2124c --- /dev/null +++ b/src/shell_and_shell_script/loops.md @@ -0,0 +1,86 @@ +# 循环 + +循环是任何编程语言中控制流语法的重要组成部分,它允许我们重复执行一段代码,直到满足某个条件为止。在Shell脚本中,我们可以使用以下几种循环结构: + +- for-in 循环: 依次循环某个数组中的每个元素。 +- for 循环:带有初始化、判断条件、迭代语句的循环。 +- while循环: 在某个条件为真时,重复执行一段代码。 +- until循环: 在某个条件为假时,重复执行一段代码。 + +接下来就让我们逐一讲解这些循环结构。 + +## 数组? + +数组是Shell脚本中的一种数据结构,它可以存储多个值,并且可以通过索引来访问这些值。在Shell脚本中,我们可以使用以下语法来定义一个数组: + +```shell +array=("value1" "value2" "value3") +``` + +数组中的元素都拥有一个唯一的索引,索引从0开始。我们可以使用以下语法来访问数组中的元素: + +```shell +array[0] +``` + +这将会返回array数组中的第一个元素,即"value1"。 + +## for-in 循环 + +for-in循环是Shell脚本中最常用的循环结构之一,它允许我们依次循环某个数组中的每个元素。以下是一个简单的for-in循环示例: + +```shell +for variable in array +do + loop_body +done +``` + +在这个示例中,variable是循环变量,array是要循环的数组。在每次循环中,variable都会被赋值为array中的一个元素,然后执行loop_body。当array中的所有元素都被循环完毕后,循环结束。 + +## for 循环 + +for循环是Shell脚本中另一种常用的循环结构,它允许我们使用初始化、判断条件、迭代语句来控制循环的执行。以下是一个简单的for循环示例: + +```shell +for ((initialization; condition; iteration)) +do + loop_body +done +``` + +在这个示例中,initialization是循环的初始化语句,condition是循环的判断条件,iteration是循环的迭代语句。在每次循环中,condition都会被判断,如果为真,则执行loop_body,然后执行iteration。当condition为假时,循环结束。 + +## while循环 + +while循环是Shell脚本中另一种常用的循环结构,它允许我们在某个条件为真时,重复执行一段代码。以下是一个简单的while循环示例: + +```shell +while condition +do + loop_body +done +``` + +在这个示例中,condition是循环的判断条件,loop_body是循环的主体。在每次循环中,condition都会被判断,如果为真,则执行loop_body。当condition为假时,循环结束。 + +## until循环 + +until循环刚好与while循环相反,它允许我们在某个条件为假时,重复执行一段代码。以下是一个简单的until循环示例: + +```shell +until condition +do + loop_body +done +``` + +在这个示例中,condition是循环的判断条件,loop_body是循环的主体。在每次循环中,condition都会被判断,如果为假,则执行loop_body。当condition为真时,循环结束。 + +until循环常常被用于多次尝试的场景下,例如尝试连接到一个远程服务器,直到连接成功为止。 + +## 课后作业 + +- 使用for循环制作一个程序,程序读取一个正整数N,并输出 2^N 的值。 +- 使用while循环制作一个猜数字游戏,程序随机生成一个1到100之间的整数,玩家需要猜出这个数字是多少,程序会根据玩家的猜测给出相应的提示,直到玩家猜对为止。 +- 使用for-in循环制作一个程序,该程序读取一个列表,并输出它的所有元素。 diff --git a/theme b/theme index e86e607..5cc3235 160000 --- a/theme +++ b/theme @@ -1 +1 @@ -Subproject commit e86e607d37ef22f6615e615624bdc5af7805f7e0 +Subproject commit 5cc3235e5adf22838eeb69ce5200acb4916db5f8 From 95860dea4dab29a8c7319aa8897d3cb3ee1fe4a5 Mon Sep 17 00:00:00 2001 From: cxykevin Date: Wed, 2 Oct 2024 13:06:04 +0800 Subject: [PATCH 2/5] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20src/shell=5Fand=5Fshel?= =?UTF-8?q?l=5Fscript/loops.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/shell_and_shell_script/loops.md | 76 ++++++++++++++++------------- 1 file changed, 41 insertions(+), 35 deletions(-) diff --git a/src/shell_and_shell_script/loops.md b/src/shell_and_shell_script/loops.md index cf2124c..29d3a0f 100644 --- a/src/shell_and_shell_script/loops.md +++ b/src/shell_and_shell_script/loops.md @@ -1,86 +1,92 @@ # 循环 -循环是任何编程语言中控制流语法的重要组成部分,它允许我们重复执行一段代码,直到满足某个条件为止。在Shell脚本中,我们可以使用以下几种循环结构: +我相信你一定听说过循环这个词,循环可以让我们重复执行一段代码,帮助我们完成一些重复的工作。循环也有许多的类型,有可以一直持续下去的,也可以就执行几次。 + +那么在 Shell Script 中,我们可以使用以下几种循环结构: - for-in 循环: 依次循环某个数组中的每个元素。 -- for 循环:带有初始化、判断条件、迭代语句的循环。 -- while循环: 在某个条件为真时,重复执行一段代码。 -- until循环: 在某个条件为假时,重复执行一段代码。 +- for 循环:可以方便的从一个数走到另一个数,当然不止这一种用法。 +- while循环: 在条件为真时,重复执行一段代码。 +- until循环: 在条件为假时,重复执行一段代码。 -接下来就让我们逐一讲解这些循环结构。 +接下来就让我们逐一讲解这些循环结构吧。 -## 数组? +## 数组 -数组是Shell脚本中的一种数据结构,它可以存储多个值,并且可以通过索引来访问这些值。在Shell脚本中,我们可以使用以下语法来定义一个数组: +数组是 Shell Script 中的一种数据结构。数组在 sh 上并不存在,你需要使用 bash。它可以存储多个值,并且可以通过数字(索引)来访问这些值。 -```shell +> 在 zsh 等 Shell 中,数组的行为并不总是一样的。下文均使用 bash。 + +在 Shell Script 中,我们可以使用以下语法来定义一个数组: + +```bash array=("value1" "value2" "value3") ``` -数组中的元素都拥有一个唯一的索引,索引从0开始。我们可以使用以下语法来访问数组中的元素: +数组中的元素都拥有一个唯一的索引,索引从 0 开始。我们可以使用下面的方法来访问数组中的元素: -```shell +```bash array[0] ``` -这将会返回array数组中的第一个元素,即"value1"。 +这将会返回 array 数组中的第一个元素,即"value1"。 ## for-in 循环 -for-in循环是Shell脚本中最常用的循环结构之一,它允许我们依次循环某个数组中的每个元素。以下是一个简单的for-in循环示例: +for-in 循环是 Shell Script 中最常用的循环结构之一,它允许我们依次循环某个数组中的每个元素。以下是一个简单的 for-in 循环示例: -```shell +```bash for variable in array do - loop_body + 你的代码 done ``` -在这个示例中,variable是循环变量,array是要循环的数组。在每次循环中,variable都会被赋值为array中的一个元素,然后执行loop_body。当array中的所有元素都被循环完毕后,循环结束。 +在这个示例中,variable 是循环变量,array 是要循环的数组。在每次循环中,variable 都会被赋值为 array 中的一个元素,然后执行你的代码。当 array 中的所有元素都被循环完毕后,循环结束。 ## for 循环 -for循环是Shell脚本中另一种常用的循环结构,它允许我们使用初始化、判断条件、迭代语句来控制循环的执行。以下是一个简单的for循环示例: +for 循环是 Shell Script 中另一种常用的循环结构,它允许我们使用初始化、判断条件、迭代语句来控制循环的执行。以下是一个简单的for循环示例: -```shell -for ((initialization; condition; iteration)) +```bash +for ((初始化语句; 你的条件; 迭代语句)) do - loop_body + 你的代码 done ``` -在这个示例中,initialization是循环的初始化语句,condition是循环的判断条件,iteration是循环的迭代语句。在每次循环中,condition都会被判断,如果为真,则执行loop_body,然后执行iteration。当condition为假时,循环结束。 +在这个例子中,初始化语句会被执行,然后执行一次判断语句。如果判断语句的结果为真,那么就会进行一次循环。当你的代码运行完毕后,会执行一次迭代语句,然后再回去执行判断。 -## while循环 +## while 循环 -while循环是Shell脚本中另一种常用的循环结构,它允许我们在某个条件为真时,重复执行一段代码。以下是一个简单的while循环示例: +while 循环允许我们在某个条件为真时,重复执行一段代码。以下是一个简单的示例: -```shell -while condition +```bash +while 条件 do - loop_body + 你的代码 done ``` -在这个示例中,condition是循环的判断条件,loop_body是循环的主体。在每次循环中,condition都会被判断,如果为真,则执行loop_body。当condition为假时,循环结束。 +while 循环就相当于一个 for 循环,但是没有了初始化和迭代语句。如果你在条件的位置写上了 `true`,那么它会永无休止的执行下去,除非你手动停止。 -## until循环 +## until 循环 -until循环刚好与while循环相反,它允许我们在某个条件为假时,重复执行一段代码。以下是一个简单的until循环示例: +until 循环刚好与 while 循环相反,它允许我们在某个条件为假时,重复执行一段代码。以下是一个简单的 until 循环示例: ```shell -until condition +until 你的条件 do - loop_body + 你的代码 done ``` -在这个示例中,condition是循环的判断条件,loop_body是循环的主体。在每次循环中,condition都会被判断,如果为假,则执行loop_body。当condition为真时,循环结束。 +until 因为 和 while 十分相似,这里就不过多解释了。 -until循环常常被用于多次尝试的场景下,例如尝试连接到一个远程服务器,直到连接成功为止。 +until 循环常常被用于多次尝试的场景下,例如尝试连接到一个远程服务器,直到连接成功为止。 ## 课后作业 -- 使用for循环制作一个程序,程序读取一个正整数N,并输出 2^N 的值。 -- 使用while循环制作一个猜数字游戏,程序随机生成一个1到100之间的整数,玩家需要猜出这个数字是多少,程序会根据玩家的猜测给出相应的提示,直到玩家猜对为止。 -- 使用for-in循环制作一个程序,该程序读取一个列表,并输出它的所有元素。 +- 使用 for 循环制作一个程序,程序读取一个正整数 N,并输出 2^N 的值(提示:只需要让变量从 1 开始,每次乘 2 即可)。 +- 使用 while 循环制作一个猜数字游戏,程序随机生成一个 1 到 100 之间的整数,玩家需要猜出这个数字是多少,程序会根据玩家的猜测给出猜大了或者猜小了的提示,直到玩家猜对为止。 +- 使用 for-in 循环制作一个程序,该程序读取一个列表,并输出它的所有元素。 From a2af7f9419c4923684aab0c9d5228ad7345d6ab4 Mon Sep 17 00:00:00 2001 From: cxykevin Date: Wed, 2 Oct 2024 13:10:37 +0800 Subject: [PATCH 3/5] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20src/shell=5Fand=5Fshel?= =?UTF-8?q?l=5Fscript/loops.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/shell_and_shell_script/loops.md | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/src/shell_and_shell_script/loops.md b/src/shell_and_shell_script/loops.md index 29d3a0f..d306366 100644 --- a/src/shell_and_shell_script/loops.md +++ b/src/shell_and_shell_script/loops.md @@ -4,10 +4,10 @@ 那么在 Shell Script 中,我们可以使用以下几种循环结构: -- for-in 循环: 依次循环某个数组中的每个元素。 -- for 循环:可以方便的从一个数走到另一个数,当然不止这一种用法。 -- while循环: 在条件为真时,重复执行一段代码。 -- until循环: 在条件为假时,重复执行一段代码。 +- `for-in`: 依次循环某个数组中的每个元素。 +- `for`:可以方便的从一个数走到另一个数,当然不止这一种用法。 +- `while`: 在条件为真时,重复执行一段代码。 +- `until`: 在条件为假时,重复执行一段代码。 接下来就让我们逐一讲解这些循环结构吧。 @@ -31,9 +31,9 @@ array[0] 这将会返回 array 数组中的第一个元素,即"value1"。 -## for-in 循环 +## `for-in` 循环 -for-in 循环是 Shell Script 中最常用的循环结构之一,它允许我们依次循环某个数组中的每个元素。以下是一个简单的 for-in 循环示例: +`for-in` 循环是 Shell Script 中最常用的循环结构之一,它允许我们依次循环某个数组中的每个元素。以下是一个简单的 for-in 循环示例: ```bash for variable in array @@ -44,7 +44,7 @@ done 在这个示例中,variable 是循环变量,array 是要循环的数组。在每次循环中,variable 都会被赋值为 array 中的一个元素,然后执行你的代码。当 array 中的所有元素都被循环完毕后,循环结束。 -## for 循环 +## `for` 循环 for 循环是 Shell Script 中另一种常用的循环结构,它允许我们使用初始化、判断条件、迭代语句来控制循环的执行。以下是一个简单的for循环示例: @@ -57,9 +57,9 @@ done 在这个例子中,初始化语句会被执行,然后执行一次判断语句。如果判断语句的结果为真,那么就会进行一次循环。当你的代码运行完毕后,会执行一次迭代语句,然后再回去执行判断。 -## while 循环 +## `while` 循环 -while 循环允许我们在某个条件为真时,重复执行一段代码。以下是一个简单的示例: +`while` 循环允许我们在某个条件为真时,重复执行一段代码。以下是一个简单的示例: ```bash while 条件 @@ -70,11 +70,11 @@ done while 循环就相当于一个 for 循环,但是没有了初始化和迭代语句。如果你在条件的位置写上了 `true`,那么它会永无休止的执行下去,除非你手动停止。 -## until 循环 +## `until` 循环 -until 循环刚好与 while 循环相反,它允许我们在某个条件为假时,重复执行一段代码。以下是一个简单的 until 循环示例: +`until` 循环刚好与 while 循环相反,它允许我们在某个条件为假时,重复执行一段代码。以下是一个简单的 until 循环示例: -```shell +```bash until 你的条件 do 你的代码 From ab84527338c258e18ea6153a076dae772f90369c Mon Sep 17 00:00:00 2001 From: cxykevin Date: Wed, 2 Oct 2024 17:53:16 +0800 Subject: [PATCH 4/5] rewrite theme --- theme | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/theme b/theme index 5cc3235..e86e607 160000 --- a/theme +++ b/theme @@ -1 +1 @@ -Subproject commit 5cc3235e5adf22838eeb69ce5200acb4916db5f8 +Subproject commit e86e607d37ef22f6615e615624bdc5af7805f7e0 From d7761efacfdf31a4a3ffe3ede59cc3d2a9a34626 Mon Sep 17 00:00:00 2001 From: cxykevin Date: Wed, 2 Oct 2024 18:29:26 +0800 Subject: [PATCH 5/5] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20src/shell=5Fand=5Fshel?= =?UTF-8?q?l=5Fscript/loops.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/shell_and_shell_script/loops.md | 66 ++++++++++++++++++++++++++--- 1 file changed, 60 insertions(+), 6 deletions(-) diff --git a/src/shell_and_shell_script/loops.md b/src/shell_and_shell_script/loops.md index d306366..59766ff 100644 --- a/src/shell_and_shell_script/loops.md +++ b/src/shell_and_shell_script/loops.md @@ -26,10 +26,10 @@ array=("value1" "value2" "value3") 数组中的元素都拥有一个唯一的索引,索引从 0 开始。我们可以使用下面的方法来访问数组中的元素: ```bash -array[0] +${array[0]} ``` -这将会返回 array 数组中的第一个元素,即"value1"。 +这将会返回 array 数组中的第一个元素,即 `value1`。 ## `for-in` 循环 @@ -42,7 +42,31 @@ do done ``` -在这个示例中,variable 是循环变量,array 是要循环的数组。在每次循环中,variable 都会被赋值为 array 中的一个元素,然后执行你的代码。当 array 中的所有元素都被循环完毕后,循环结束。 +在这个示例中,variable 是循环变量,array 是要循环的数组。在每次循环中,variable 都会按顺序被赋值为 array 中的一个元素,然后执行你的代码。当 array 中的所有元素都被循环完毕后,循环结束。 + +这里 array 除了可以放数组之外,也可以放字符串(按行遍历)和范围语句。 + +范围语句的格式如下: + +```bash +{起点..终点} +{起点..终点..步长} +``` + +> 在 bash 中,起点可以大于终点,但是步长要为正数。并且起点和终点都会被遍历 + +例如: + +```bash +for num in {1..10} +do + echo $num +done +``` + +会输出从 1 到 10。 + +> 在范围语句内不能加变量,如果需要使用变量请往下看。 ## `for` 循环 @@ -57,6 +81,21 @@ done 在这个例子中,初始化语句会被执行,然后执行一次判断语句。如果判断语句的结果为真,那么就会进行一次循环。当你的代码运行完毕后,会执行一次迭代语句,然后再回去执行判断。 +例如: + +```bash +for ((i=1; i<=10; i++)) +do + echo $i +done +``` + +就对应了 `{1..10..1}` 的结果。 + +> 这里表达式和方括号有区别,不能使用 `-lt` 一类的符号。可以使用:`==`、`>=`、`<=`、`!=`。 +> +> 而后面的 `i++` 中,可以使用 `--`,也可以使用 `+=`、`-=`、`*=`、`/=` 后面加一个数字。 + ## `while` 循环 `while` 循环允许我们在某个条件为真时,重复执行一段代码。以下是一个简单的示例: @@ -70,6 +109,21 @@ done while 循环就相当于一个 for 循环,但是没有了初始化和迭代语句。如果你在条件的位置写上了 `true`,那么它会永无休止的执行下去,除非你手动停止。 +> while 中的条件需要使用方括号。 + +例如: + +```bash +i=1 +while [ $i -le 10 ] +do + echo $i + i=$[ $i + 1 ] +done +``` + +和上面 for 的版本是一样的。 + ## `until` 循环 `until` 循环刚好与 while 循环相反,它允许我们在某个条件为假时,重复执行一段代码。以下是一个简单的 until 循环示例: @@ -87,6 +141,6 @@ until 循环常常被用于多次尝试的场景下,例如尝试连接到一 ## 课后作业 -- 使用 for 循环制作一个程序,程序读取一个正整数 N,并输出 2^N 的值(提示:只需要让变量从 1 开始,每次乘 2 即可)。 -- 使用 while 循环制作一个猜数字游戏,程序随机生成一个 1 到 100 之间的整数,玩家需要猜出这个数字是多少,程序会根据玩家的猜测给出猜大了或者猜小了的提示,直到玩家猜对为止。 -- 使用 for-in 循环制作一个程序,该程序读取一个列表,并输出它的所有元素。 +- 使用 for 循环制作一个程序,这个程序读取一个正整数 N,并输出 2^N 的值(提示:只需要让变量从 1 开始,每次乘 2 即可)。 +- 使用 while 循环制作一个猜数字游戏,程序会随机生成一个 1 到 100 之间的整数,玩家需要猜出这个数字是多少,程序会根据玩家的猜测给出猜大了或者猜小了的提示,直到玩家猜对为止(提示:生成随机数可以使用 `$[ $RANDOM % 99 + 1 ]`,其中 `$RANDOM` 是一个 0~32767 的随机整数)。 +- 使用 for-in 循环制作一个程序,该程序读取一个列表,并挨个输出它的所有元素。