1. 程式人生 > 實用技巧 >十三、Shell之select語句

十三、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:\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: