@@ -40,11 +40,15 @@ Shell Tutorial
4040 - [ 文件测试操作符] ( #文件测试操作符 )
4141 - [ 比较操作符] ( #比较操作符 )
4242- [ 操作字符串] ( #操作字符串 )
43- - [ 循环和分支] ( #循环和分支 )
44- - [ Loops] ( #Loops )
43+ - [ for/while] ( #forwhiles )
44+ - [ for] ( #for )
45+ - [ while] ( #while )
46+ - [ until] ( #until )
4547 - [ 嵌套循环] ( #嵌套循环 )
4648 - [ 循环控制] ( #循环控制 )
4749- [ case/select] ( #caseselect )
50+ - [ case] ( #case )
51+ - [ select] ( #select )
4852
4953
5054
@@ -65,11 +69,13 @@ echo $NUM
6569chmod +x ./demo1 # 使每个人都有执行的权限
6670chmod +rx ./demo1 # 使每个人都有读和执行的权限
6771chmod u+rx ./demo1 # 仅仅使脚本文件拥有者有读和执行的权限
72+ chmod u+x ./demo1 # 只有自己可以执行,其它人不能执行
73+ chmod ug+x ./demo1 # 只有自己以及同一群可以执行,其它人不能执行
6874chmod 555 ./demo1 # 使每个人都有读和执行的权限
69- chmod 777 ./demo1
75+ chmod 777 ./demo1
7076```
7177
72- 当前目录下运行 demo1 脚本
78+ 当前目录下运行 [ demo1] ( ./example/demo1 ) 脚本
7379
7480``` bash
7581./demo1
@@ -467,7 +473,10 @@ echo $myUrl
467473| $LINENO | 这个变量表示在本shell脚本中该变量出现时所在的行数。它只在脚本中它出现时有意义,它一般可用于调试。|
468474| $MACHTYPE | 机器类型,识别系统的硬件类型。|
469475| $OLDPWD | 上一次工作的目录("OLD-print-working-directory",你上一次进入工作的目录)|
470- | $OSTYPE | 操作系统类型|
476+ | $TZ | 时区 |
477+ | $MAILCHECK | 每隔多少秒检查是否有新的信件 |
478+ | $OSTYPE | 操作系统类型 |
479+ | $MANPATH man | 指令的搜寻路径 |
471480| $PATH | 可执行程序文件的搜索路径。一般有/usr/bin/, /usr/X11R6/bin/, /usr/local/bin,等等。|
472481| $PIPESTATUS | 此数组变量保存了最后执行的前台管道的退出状态。相当有趣的是,它不一定和最后执行的命令的退出状态一样。|
473482| $PPID | 一个进程的$PPID变量保存它的父进程的进程ID(pid)。用这个变量和pidof命令比较。|
@@ -717,8 +726,6 @@ echo $? # 因为上一条命令执行成功,打印0。
717726lskdf # 无效命令。
718727echo $? # 因为上面的无效命令执行失败,打印一个非零的值。
719728
720- echo
721-
722729exit 113 # 返回113状态码给shell。
723730 # 可以运行脚本结束后立即执行命令"echo $?" 检验。
724731
@@ -964,10 +971,9 @@ echo | awk '{
964971exit 0
965972```
966973
974+ ## for/while
967975
968- ## 循环和分支
969-
970- ### Loops
976+ ### for
971977
972978重复一些命令的代码块,如果条件不满足就退出循环,下面是一个基本的循环结构。[ demo27] ( ./example/demo27 )
973979
987993done
988994```
989995
996+ ### while
997+
998+ 一个while循环可以有多个判断条件,但是只有最后一个才能决定是否退出循环。然而这需要一种有点不同的循环语法。
999+
1000+ > while [ condition]
1001+ > do
1002+ > command...
1003+ > done
1004+
1005+ ``` shell
1006+ # --------------------------
1007+ # 简单的while循环
1008+ # --------------------------
1009+ var0=0
1010+ LIMIT=10
1011+
1012+ while [ " $var0 " -lt " $LIMIT " ]
1013+ do
1014+ echo -n " $var0 " # -n 将会阻止产生新行。
1015+ # ^ 空格,数字之间的分隔。
1016+ var0=` expr $var0 + 1` # var0=$(($var0+1)) 也可以。
1017+ # var0=$((var0 + 1)) 也可以。
1018+ # let "var0 += 1" 也可以。
1019+ done # 使用其他的方法也行。
1020+ # --------------------------
1021+ # 多条件的while循环
1022+ # --------------------------
1023+ var1=unset
1024+ previous=$var1
1025+
1026+ while echo " previous-variable = $previous "
1027+ echo
1028+ previous=$var1
1029+ [ " $var1 " != end ] # 记录之前的$var1.
1030+ # 这个"while"循环中有4个条件, 但是只有最后一个能控制循环.
1031+ # 退出状态由第4个条件决定.
1032+ do
1033+ echo " Input variable #1 (end to exit) "
1034+ read var1
1035+ echo " variable #1 = $var1 "
1036+ done
1037+ exit 0
1038+ ```
1039+
1040+ ### until
1041+
1042+ 这个结构在循环的顶部判断条件,并且如果条件一直为false那就一直循环下去。(与while相反)。
1043+
1044+ > until [ condition-is-true]
1045+ > do
1046+ > command...
1047+ > done
1048+
1049+ ** 注意⚠️**
1050+
1051+ 1 . until循环的判断在循环的顶部,这与某些编程语言是不同的。
1052+ 2 . 与for循环一样,如果想把do和条件放在一行里,就使用";"。
1053+
1054+ > until [ condition-is-true] ; do
1055+
1056+ ``` shell
1057+ END_CONDITION=end
1058+ until [ " $var1 " = " $END_CONDITION " ]
1059+ # 在循环的顶部判断条件.
1060+ do
1061+ echo " Input variable #1 "
1062+ echo " ($END_CONDITION to exit)"
1063+ read var1
1064+ echo " variable #1 = $var1 "
1065+ done
1066+ exit 0
1067+ ```
1068+
9901069### 嵌套循环
9911070
9921071嵌套循环就是在一个循环中还有一个循环,内部循环在外部循环体中。[ demo28] ( ./example/demo28 )
@@ -1018,7 +1097,6 @@ done
10181097exit 0
10191098```
10201099
1021-
10221100### 循环控制
10231101
10241102影响循环行为的命令 ` break ` , ` continue ` , break命令将会跳出循环,continue命令将会跳过本次循环下边的语句,直接进入下次循环。[ demo29] ( ./example/demo29 )
@@ -1041,16 +1119,14 @@ do
10411119done
10421120```
10431121
1044-
10451122## case/select
10461123
10471124case/select依靠在代码块的顶部或底部的条件判断来决定程序的分支。
10481125
1049- ### case(in)/esac
1126+ ### case
10501127
10511128case它允许通过判断来选择代码块中多条路径中的一条。它的作用和多个if/then/else语句相同,是它们的简化结构,特别适用于创建目录。[ demo30] ( ./example/demo30 )
10521129
1053-
10541130> case "$variable" in
10551131> ?"$condition1" )
10561132> ?command...
@@ -1060,7 +1136,6 @@ case它允许通过判断来选择代码块中多条路径中的一条。它的
10601136> ?;;
10611137> esac
10621138
1063-
10641139- 对变量使用` "" ` 并不是强制的,因为不会发生单词分离。
10651140- 每句测试行,都以右小括号` ) ` 结尾。
10661141- 每个条件块都以两个分号结尾` ;; ` 。
0 commit comments