十三、Shell之select语句

一、select介绍

select循环语句的主要作用可能就是创建菜单,在执行带select循环语句的脚本时,输出会按照数字顺序的列表显示一个菜单项,并显示提示符(默认是#?),同时等待用户输入数字进行选择。

二、select语法格式

select 变量名 [in 菜单取值列表]
do
   命令集
done

     在这种select循环语句的语法中,在执行脚本后,select关键字后面会有一个“变量名”,变量名依次获取in关键字后面的变量取值列表内容(以空格分隔),每次仅取一个,然后进入循环(do和done之间),执行循环内的所有指令,当执行到done时结束返回,之后,“变量名”再继续取变量列表里的下一个变量值,继续执行循环内的所有指令(do和done之间的指令),当执行到done时结束返回,以此类推,直到取完最后一个变量列表里的值并进入循环执行到done结束为止。与for循环不同的是,select循环执行后会出现菜单项等待用户选择(不会自动循环所有变量列表),而用户输入的只能是菜单项前面的数字序号,每输入一次对应的序号就会执行一次循环,直到变量后面对应列表取完为止。

三、select的逻辑结构图

四、用select循环打印简单菜单项的多种实现方法

方案1:直接使用列表字符串

#! /bin/bash
select name in ywx kaka king
do
  echo $name
done

[root@node1 scripts]# sh select1.sh 
1) ywx
2) kaka
3) king
#? 1
ywx
#? 2
kaka
#? 3
king
#? 

方案2:采用数组做变量列表

#! /bin/bash
array=(ywx kaka king)
select name in "${array[@]}"
do
  echo $name
done

[root@node1 scripts]# sh select1.sh 
1) ywx
2) kaka
3) king
#? 1
ywx
#? 2
kaka
#? 3
king
#? 

方案3:把命令结果作为变量列表

[root@node1 scripts]# ls /tmp
501.html  502.html  503.html  king1.bin  king2.bin  king3.bin  king4.bin  king5.bin  king6.bin

[root@node1 scripts]#cat /scripts/select1.sh
#! /bin/bash
select filename in $(ls /tmp)
do
  echo $filename
done

[root@node1 scripts]# sh select1.sh 
1) 501.html   3) 503.html   5) king2.bin  7) king4.bin    9) king6.bin
2) 502.html   4) king1.bin  6) king3.bin  8) king5.bin
#? 1
501.html
#? 2
502.html
#? 3
503.html
#? 

五、调整select循环菜单项的默认提示符及利用select变量打印数字序号

[root@node1 scripts]# cat select1.sh
#! /bin/bash
PS3="please select a num from menu:"     #<== PS3就是控制select循环的提示符,
select filename in $(ls /tmp)
do
    echo -e "I guess you selected the menu is:
 $REPLY) $filename"  #<==REPLY变量就是菜单项对应的数字。
done

[root@node1 scripts]# sh select1.sh 
1) 501.html   3) 503.html   5) king2.bin  7) king4.bin    9) king6.bin
2) 502.html   4) king1.bin  6) king3.bin  8) king5.bin
please select a num from menu:1
I guess you selected the menu is:
 1) 501.html
please select a num from menu:2
I guess you selected the menu is:
 2) 502.html
please select a num from menu:
I have a dream so I study hard!!!
原文地址:https://www.cnblogs.com/yaokaka/p/13816397.html