十三、Shell之select语句
一、select介绍
select循环语句的主要作用可能就是创建菜单,在执行带select循环语句的脚本时,输出会按照数字顺序的列表显示一个菜单项,并显示提示符(默认是#?),同时等待用户输入数字进行选择。
二、select语法格式
select 变量名 [in 菜单取值列表] do 命令集 done 在这种select循环语句的语法中,在执行脚本后,select关键字后面会有一个“变量名”,变量名依次获取in关键字后面的变量取值列表内容(以空格分隔),每次仅取一个,然后进入循环(do和done之间),执行循环内的所有指令,当执行到done时结束返回,之后,“变量名”再继续取变量列表里的下一个变量值,继续执行循环内的所有指令(do和done之间的指令),当执行到done时结束返回,以此类推,直到取完最后一个变量列表里的值并进入循环执行到done结束为止。与for循环不同的是,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 #?
[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:\n $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!!!