老胡的辦法:
使用Linux的時候經常會編寫指令碼,有時候這些指令碼需要和使用者產生一些互動,要由使用者進行選擇或者輸入一些內容。這個時候互動式選單就比較有用了。關於互動式選單老胡倒是有幾個實現的思路:
最簡單的做法就是先列印一行資訊,提示使用者輸入yes/no,然後使用read從終端讀取使用者的輸入並放到變數中:
這樣的做法好處是比較簡單,隨手一寫就OK了。壞處就是對使用者的輸入並沒有作出限制,使用者隨便輸入什麼都可以賦值給變數answer,指令碼讀取到之後還需要進一步處理。
在前面的基礎上,加上case分支判斷來處理輸入項,使之能夠與我們期望的輸入一致,以便於準確做出選擇:
可能有的朋友看見這個case的模式比較陌生,其實這裡的模式和cut命令使用的模式是類似的,[Yy]*代表匹配一個大寫或者小寫的字母Y開頭的任意長度字串,[Nn]*就是字母N開頭的任意長度字串。這裡的目的是保留了一定的容錯性,又考慮了y和n的語義上的代表性。如果只需要匹配單個的y或者n,就把後面的*去掉就可以了。
相比之下,case更適合做流程控制,拿來做使用者互動有點生硬。select比case更加適合用作使用者互動選擇選單:
select會使用輸入的數字作為索引,在列表中去匹配對應的字串,然後賦值給引數變數。case語句根據引數變數的值去選擇對應的動作。select結構本身就是一個死迴圈,所以要在適當的分支中有跳出迴圈的break語句。
最後要介紹的就是bash終端的“視覺化”互動工具whiptail:
效果:
總結一下,基於Linux命令列的互動式菜單核心思想還是要限制好使用者的輸入行為,畢竟判斷使用者的輸入yes或者no還是很簡單的,關鍵還是怎樣檢測y/n之外的輸入值。使用case語句最簡單,select更加高階一點,最方便成熟的還是用whiptail了,介面也比較友好。
老胡的辦法:
使用Linux的時候經常會編寫指令碼,有時候這些指令碼需要和使用者產生一些互動,要由使用者進行選擇或者輸入一些內容。這個時候互動式選單就比較有用了。關於互動式選單老胡倒是有幾個實現的思路:
一、最簡單的實現最簡單的做法就是先列印一行資訊,提示使用者輸入yes/no,然後使用read從終端讀取使用者的輸入並放到變數中:
#!/bin/bashecho -n "經理老胡是不是最帥的 (y/n)? "read answer這樣的做法好處是比較簡單,隨手一寫就OK了。壞處就是對使用者的輸入並沒有作出限制,使用者隨便輸入什麼都可以賦值給變數answer,指令碼讀取到之後還需要進一步處理。
二、使用case分支判斷在前面的基礎上,加上case分支判斷來處理輸入項,使之能夠與我們期望的輸入一致,以便於準確做出選擇:
可能有的朋友看見這個case的模式比較陌生,其實這裡的模式和cut命令使用的模式是類似的,[Yy]*代表匹配一個大寫或者小寫的字母Y開頭的任意長度字串,[Nn]*就是字母N開頭的任意長度字串。這裡的目的是保留了一定的容錯性,又考慮了y和n的語義上的代表性。如果只需要匹配單個的y或者n,就把後面的*去掉就可以了。
三、使用select命令相比之下,case更適合做流程控制,拿來做使用者互動有點生硬。select比case更加適合用作使用者互動選擇選單:
select會使用輸入的數字作為索引,在列表中去匹配對應的字串,然後賦值給引數變數。case語句根據引數變數的值去選擇對應的動作。select結構本身就是一個死迴圈,所以要在適當的分支中有跳出迴圈的break語句。
四、“視覺化”的whiptail最後要介紹的就是bash終端的“視覺化”互動工具whiptail:
效果:
總結一下,基於Linux命令列的互動式菜單核心思想還是要限制好使用者的輸入行為,畢竟判斷使用者的輸入yes或者no還是很簡單的,關鍵還是怎樣檢測y/n之外的輸入值。使用case語句最簡單,select更加高階一點,最方便成熟的還是用whiptail了,介面也比較友好。