[root@linuxidc ~]# select fname in cat dog sheep mouse;do echo your choice: \"$REPLY\) $fname\";break;done 1) cat 2) dog 3) sheep 4) mouse #? 3 # 在此选择序号3 your choice: "3) sheep" # 将输出序号3对应的内容
语法结构:
select name [ in word ] ; do cmd_list ; done
它的结构几乎和for循环的结构相同。有以下几个要点:
(1).in关键词后的word将根据IFS变量进行分割,分割后的每一项都进行编号,作为菜单序号被输出,如果省略in word,则等价于"in $@",即将位置变量的内容作为菜单项。
(2).当选择菜单序号后,该序号的内容将保存到变量name中,并且所输入的内容(一般是序号值,例如上面的例子中输入的3,但不规定一定要输入序号值,例如随便输入几个字符)保存保存到特殊变量REPLY中。
(3).每次输入选择后,select语句都将重置,如果输入的菜单序号存在,则cmd_list会重新执行,变量name也将重置。如果没有break命令,则select语句会一直运行,如果遇到break命令,将退出select语句。
仍然是上面的示例:但不是用break
[root@linuxidc ~]# select fname in cat dog sheep mouse;do echo your choice: \"$REPLY\) $fname\";done 1) cat 2) dog 3) sheep 4) mouse #? 2 your choice: "2) dog" #? habagou # 随意输入几个字符 your choice: "habagou) " # 变量fname被重置为空,变量REPLY被赋予了输入的值habagou #? 2 3 your choice: "2 3) " #? ^C # 直到杀掉进程select才结束
1.5 循环结构:forfor循环再shell脚本中应用极其广泛,它有两种语法结构:
结构一:for name [ [ in [ word ... ] ] ; ] do cmd_list ; done
结构二:for (( expr1 ; expr2 ; expr3 )) ; do cmd_list ; done
结构一中:将扩展in word,然后按照IFS变量对word进行分割,并依次将分割的单词赋值给变量name,每赋值一次,执行一次循环体cmd_list,然后再继续将下一个单词赋值给变量name,直到所有变量赋值结束。如果省略in word,则等价于"in $@",即展开位置变量并依次赋值给变量name。注意,如果word中使用引号包围了某些单词,这引号包围的内容被分割为一个单词。
例如:
[root@linuxidc ~]# for i in 1 2 3 4;do echo $i;done 1 2 3 4
[root@linuxidc ~]# for i in 1 2 "3 4";do echo $i;done 1 2 3 4
结构二中:该结构的expr部分只支持数学计算和比较。首先计算expr1,再判断expr2的返回状态码,如果为0,则执行cmd_list,并将计算expr3的值,并再次判断expr2的状态码。直到expr2的返回状态码不为0,循环结束。
例如:
[root@linuxidc ~]# for ((i=1;i<=3;++i));do echo $i;done 1 2 3
[root@linuxidc ~]# for ((i=1,j=3;i<=3 && j>=2;++i,--j));do echo $i $j;done 1 3 2 2
1.6 循环结构:while使用while循环尽量要让条件运行到可以退出循环,否则无限循环。一般都在命令体部分加上变量的改变行为。
语法结构:
while test_cmd_list; do cmd_list; done
首先执行test_cmd_list中的命令,当test_cmd_list的最后一个命令的状态码为0时,将执行一次cmd_list,然后回到循环的开头继续执行test_cmd_list。只有test_cmd_list中最后一个测试命令的状态码非0时,循环才会退出。
例如:计算1到10的算术和。