流控制:
if、then、else語句提供條件測試。測試可以基于各種條件。例如檔案的權限,長度,數值等
case語句允許比對模式,單詞或值。一旦模式或值比對,就可以基于這個比對條件做其它聲明。
循環
for循環 每次處理依次清單内資訊,直至循環耗盡。
until循環 此循環語句不常用,until循環直到條件為真,條件部分在循環末尾部分。
while循環 些循環當條件為真時,循環執行,條件部分在循環頭。
流控制語句的任何循環均可嵌套使用,例如可以在一個for循環中嵌入另一個for循環
IF THEN ELSE語句
if語句測試條件,測試條件傳回真或假後,可相應執行一系列語句,if語句結構對錯誤檢查非常有用
if 條件1
then 指令1
elif 條件2
then 指令2
else 指令3
fi
讓我們來具體講解if語句的各部分功能
=========================================
if 條件1 //如果條件1為真
then //那麼
指令1 //執行指令1
elif 條件2 //如果條件1不成立
指令2 //執行指令2
else //如果條件1,2均不成立
指令3 //那麼執行指令3
fi //結束
if語句必須以單詞fi終止,esif和else為可選項,如果語句中沒有否則部分,那麼就不需要elif和else
最簡單的if語句
if 條件
then 指令
使用if語句時,必須将then部分放在新行,否則會産生錯誤。如果不要分行,必須使用指令分隔符
可以使用以下格式
if 條件; then
指令
then不換行,必須要在其前面一句結束處加;号
以下是一個小腳本
==================================================
[root@localhost Shell]# more iftest.sh
#/bin/bash
#ScriptName iftest
#This is a comment line, all comment lines start with a #
if [ "10" -lt "13" ]; then
# yes,10 is less than 13
echo "Yes,10 is less than 13"
執行結果為
[root@localhost Shell]# sh iftest.sh
Yes,10 is less than 13
再來一個例子看下
[root@localhost Shell]# more iftest2.sh
#!/bin/bash
#ScriptName iftest2
echo -n "Please enter you name: "
read name
if [ "$name" = "" ]; then
echo "You did enter any information!"
else
echo "You name is : $name"
執行結果
[root@localhost Shell]# sh iftest2.sh
Please enter you name: LinuxShell
You name is : LinuxShell
Please enter you name:
You did enter any information!
[root@localhost /]# cat ifpwd.sh
#ScriptName ifpwd
DIRECTORY=`pwd`
if [ "$DIRECTORY" != "/" ]; then
echo "You need to be in the root directory not $DIRECTORY to run this script" >&2
exit 1
===============================================================
運作結果
[root@localhost Shell]# sh ifpwd.sh
You need to be in the root directory not /root/Shell to run this script
[root@localhost Shell]# cp ifpwd.sh /
[root@localhost Shell]# cd /
[root@localhost /]# sh ifpwd.sh
測試傳遞到腳本中的參數個數
if語句可用來測試傳入腳本中參數的個數,使用特定變量$#,表示調用參數的個數。
以下測試確定腳本有三個參數,如果沒有,剛傳回一個可用資訊到标準錯誤,然後代碼退出并顯示退出
狀态。如果參數數目等于3,則顯示所有參數。
================================================================
[root@localhost Shell]# cat -n ifparam.sh
1 #!/bin/bash
2 #ScriptName ifparam
3 if [ $# -lt 3 ]; then
4 echo "Usage: $0 arg1 arg2 arg3" >&2
5 exit 1
6 fi
7 echo "arg1: $1"
8 echo "arg2: $2"
9 echo "arg3: $3"
[root@localhost Shell]# sh ifparam.sh John Smith
Usage: ifparam.sh arg1 arg2 arg3
下面給3個參數
[root@localhost Shell]# sh ifparam.sh John Smith Tom
arg1: John
arg2: Smith
arg3: Tom
測試目錄建立結果
建立一個目錄,如果沒有輸入建立目錄的名字,那麼提示用法。如果目錄已經存在,那麼什麼都不做
如果目錄不存在,則提示目錄不存在,是否建立,建立輸入y不建立輸入n
腳本如下
[root@localhost Shell]# more ifmkdir.sh
#ScriptName
DIRECTORY=$1
if [ "$DIRTCTORY" = "" ]
then
echo "Usage : $0 directory to create." >&2
if [ -d $DIRECTORY ]
then :
else
echo "The directory does exists"
echo -n "Create it now?[y..n]:"
read ANS
if [ "$ANS" = "y" ] || [ "$ANS" = "Y" ]
echo "Createing now."
mkdir $DIRECTORY >/dev/null 2>&1
if [ $? != 0 ]; then
echo "Errors createing the diryctory $DIRECTORY" >&2
else :
以下為執行結果。
[root@localhost Shell]# sh ifmkdir.sh
Usage : ifmkdir.sh directory to create.
[root@localhost Shell]# sh ifmkdir.sh LinuxShell
The directory does exists
Create it now?[y..n]:y
Createing now.
[root@localhost Shell]# ls
LinuxShell father.sh grepstr.sh ifdirsc.sh ifparam.sh iftest.sh param.sh
child.sh findfile.sh hello.sh.bak ifeditor.sh ifpwd.sh iftest2.sh
data.file grepif.sh ifcp.sh ifmkdir.sh ifroot.sh ifwr.sh
多個IF語句
看下面一個腳本
=============================================================================
[root@localhost Shell]# cat ifseted.sh
#ScriptName ifseted.sh
#Author:Honway
#Date:2011-08-09
if [ -z $EDITOR ]; then
echo "Your EDITOR environment is not set."
echo "I Will assume you want to use vi..OK"
echo -n "DO you wish to chang is now? [y..n]:"
if [ "$ANS" = "Y" ] || [ "$ANS" = "y" ]; then
echo -n "enter you editor type:"
read EDITOR
if [ -z "$EDITOR" ] || [ "$EDITOR" = "" ]; then
echo "No editor entered,Using vi as default."
EDITOR=vi
export EDITOR
fi
EDITOR=$EDITOR
export EDITOR
echo "Setting $EDITOR"
echo "Using vi as the default editor"
EDITOR=vi
設定預設編輯器,開始的時候,檢查有沒有設定預設編輯器。如果為空,那麼會提示使用者
然後給出一個選擇,是不是現在要設定,是的話輸入Y否則輸入N,不管輸入的是大Y還是小Y
都提示使用者輸入編輯器類型。如果沒有輸入,那麼就設定為VI,如果輸入,就用使用者輸入的
編輯器作為預設編輯器。如果在上一步使用者輸入N,那麼使用VI作為預設編輯器
**************************
*** CASE語句 ***
case語句為多選語句。可以用case語句比對一個值與一個模式。如果比對成功,執行相比對指令
======================================
case語句格式:
case 值 in
模式1)
指令1
;;
模式2)
指令2
esac
case工作方式如上。取值後面必須為單詞in,每一模式必須以右括号結束。取值可以為變量或常數
比對發現取值符合某一模式後,其間所有指令開始執行直到遇到符号;;結束
取值将檢測比對的每一個模式。一旦模式比對,則執行完比對模式相應指令後不再繼續其他模式。
如果無一比對模式。使用星号*捕獲該值,再接受其它輸入。
模式部分可能包括元字元,與在指令行檔案擴充名例子中使用過的比對模式類型相同,即:
=========================
* 任意字元
? 任意單字元
[..] 類或範圍中任意字元
==========================
看一個小腳本先
====================================================
#ScriptName caseselect
#DATE:2011-08-10
echo -n "Enter a number from 1-5 :"
case $ANS in
1) echo "You select 1"
;;
2) echo "You select 2"
3) echo "You select 3"
4) echo "You select 4"
5) echo "You select 5"
*) echo "$0 : This is not between 1 and 5."
很簡單,不解釋。
再來一腳本例子
#ScriptName caseterm
echo "Choices are .. vt100,vt102,vt220."
echo -n "Enter your terminal type: "
read TERMINAL
case $TERMINAL in
vt100|vt102) TERM=vt100
vt220) TERM=vt220
*) echo "$0 : Unknow response"
echo "Seting it to vt100 anyway,so there."
TERM=vt100
export TERM
echo "Your terminal is set to $TERM"
這個也沒什麼特别,就是說明了可以用|來代替或指令.
==
再來一腳本
#caseans
echo -n "Do you wish to proceed [y..n] :"
y|Y|yes|Yes) echo "Yes is selected "
n|N|no|No) echo "No is selected. "
exit 0 #No error so only use exit 0 to terminate
*) echo "$0 : Unknow response" >&2
跟上面的腳本一樣,隻是說明|可以代替或指令
捕獲輸入并執行空指令
不一定要在比對模式後加入指令,如果你原本不想做什麼,隻是在進一步處理前過濾出意外
如果要運作對應于一個會計部門的帳目報表,必須首先決定運作報表的類型前确認使用者輸入一個
有效的部門号,比對所有可能值,其它值 無效。用case可以很容易實作
下面的腳本中如果使用者輸入部門号不是234,453,655或454,使用者退出并傳回可用資訊。一旦
響應了使用者的有效部門号,腳本就用同樣的技術取得報表類型。
=============================================================
TYPE=""
echo -n "Enter the account dept NO. :"
read ACC
case $ACC in
234);;
453);;
655);;
454);;
*) echo "$0 : Unkonw dept NO:" >&2
echo "Try.. 234,453,655,454"
echo " 1. post"
echo " 2. prior"
echo -n "Enter the type of report: "
read ACC_TYPE
case $ACC_TYPE in
1) TYPE=post;;
2)TYPE=prior;;
*) echo "$0 : Unkonw account type. " >&2
echo "Now running report for dept $ACC for the type $TYPE"
預設變量值
如果在讀變量時輸入Enter鍵,不一定總是退出腳本,可以先測試是否已設定了變量,如果未設定,可以
設定該值。
下面腳本中,要求使用者輸入運作報表日期。如果使用者輸入Enter鍵,則使用預設日期星期六,并設定為WHEN
的取值。如果使用者輸入另外一天,這一天對于CASE語句是運作的有交日期,即星期六,星期四,星期一
=====================================================
#ScriptName caserep
echo "--===============================--"
echo " Weekly Report "
echo -n "What day do you want to run report [Saturday]: "
read WHEN
echo "Validating..${WHEN:="Saturday"}"
case $WHEN in
Monday|MONDAY|mon)
Sunday|SUNDAY|sun)
Saturday|SATURDAY|SAT)
*) echo "Are you nuts! this report can only be run on " >&2
echo " on a Saturday,Sunday or Monday " >&2
echo "Report to run on $WHEN"
*************************
****** FOR循環 ******
for循環一般格式為:
---============================---
for 變量名 in 清單
do
指令2...
done
當變量值在清單裡,for循環即執行一次所有指令,使用變量名通路清單中取值,指令可為
任何有交的shell指令和語句。變量名為任何單詞。in清單用法是可選的,如果不用它,for循環使用
指令行的位置參數
in清單可以包含替換,字元串和檔案名。
一個簡單的for循環
#ScriptName for_i
for loop in 1 2 3 4 5
echo $loop
上面的腳本,變量loop在清單1 2 3 4 5中,等于是把1 2 3 4 5五個值賦給了loop.然後依次列印
[root@localhost Shell]# sh for_i.sh
1
2
3
4
5
列印字元串清單
下面for循環中,清單包含字元串"Orange Red Blue Grey",指令為echo,變量名為loop,echo指令使用
$loop回報出清單中所有取值,直到清單為空
[root@localhost Shell]# cat forlist.sh
#ScriptName forlist
for loop in Orange Red Blue Grey
do
echo $loop
[root@localhost Shell]# sh forlist.sh
Orange
Red
Blue
Grey
看下跟下面的有什麼差別
for loop in "Orange Red Blue Grey"
Orange Red Blue Grey
腳本中多了個雙引号"",用雙引号引起來,值相當于是一個,然後會被echo一下輸出。
對for循環使用ls指令
這個循環執行ls指令,列印目前目錄下所有檔案
[root@localhost Shell]# cat forls.sh
#ScriptName forls
for loop in `ls`
[root@localhost Shell]# sh forls.sh
LinuxShell
caseans.sh
caseparam.sh
caserep.sh
caseselect.sh
caseterm.sh
********************
對for循環使用參數
在for循環中省去in清單選項時,它将接受指令行位置參數作為參數。實際上即指明:
for params in "$@"
或
for params in "$*"
""号可以省略,其實最好省略(個人實踐中發現。)
下面的例子不使用in清單選項,for循環檢視特定參數$@或$*,以從指令行中取得參數。
---==================================---
#forparam2
for params
echo "You supplied $params as a command line option"
[root@localhost Shell]# sh forparam2.sh John Smith Tom Gim Kite
You supplied John as a command line option
You supplied Smith as a command line option
You supplied Tom as a command line option
You supplied Gim as a command line option
You supplied Kite as a command line option
每一個參數,都被列印出來了。
---================================================---
[root@localhost Shell]# cat forparam3.sh
#ScriptName forparam3
for params in "$@"
echo "You supplied $params as a command line option"
[root@localhost Shell]# sh forparam3.sh John Tom Cat Dog God
You supplied Cat as a command line option
You supplied Dog as a command line option
You supplied God as a command line option
[root@localhost Shell]# cat forparam4.sh
#ScriptName forparam4
for params in "$*"
echo "You supplied $params as a commad line option"
[root@localhost Shell]# sh forparam4.sh God Girl John
You supplied God Girl John as a commad line option
在使用$*的時候,如果想讓結果輸出多行。那麼應該把""去掉,如下
for params in $*
[root@localhost Shell]# sh forparam4.sh Dog God
You supplied Dog as a commad line option
You supplied God as a commad line option
由上,推出一個查找檔案的小腳本。内容如下:
#ScriptName forfind
for loop in $* //同上,in $* 或者$@ 或者省略in表示傳遞參數
find / -name $loop -print // -print可省略
使用for循環連接配接伺服器
#ScriptName forping
HOSTS=192.168.2.1
for loop in $HOSTS
ping -c 2 $loop
#ScriptName forssh
#AUTHOR: Honway
#DATE:2011-08-11
echo -n "Please enter your server's IP [default ip:localhost] :"
read IP
echo -n "Please enter your server's port[defaul port:22] : "
read PORT
echo -n "Please enter your username[default user:root] :"
read USERNAME
echo "Start connecting $IP........ "
echo "Please waiting...."
ssh ${USERNAME:=root}@${IP:=localhost} -p ${PORT:=22}
多檔案轉換
#ScriptName forUC
for files in `ls *.sh`
cat $files | tr "[a-z]" "[A-Z]" >$files.UC
在目前目錄查找所有.sh檔案,然後把檔案裡的字母轉換為大寫字母,最後把轉換後的結果寫入到
目前檔案名後面加.UC的檔案中
删除所有指定檔案類型中的空行
#Forsed
sed -e "/^$/d" $files >$files.HOLD
mv $files.HOLD $files
删除所有.sh檔案中的空行,這裡有一個mv指令,如果在系統中直接運作mv,并且同名檔案存在,會有
提示資訊,但是腳本裡面确沒有。我們輸入alias看到,mv ='m -i' ,是以我們運作時才有提示資訊
如果把别名去掉,就沒有了。那現在問題就很明顯了,腳本裡執行的時候,沒有調用父Shell裡的别名
循環計數
我們用for來計算目前目錄的所有檔案數
#forcount
counter=0
for files in *
counter=`expr $counter + 1`
done
echo "There are $counter files in `pwd` we do need to process"
+1是為了統計的時候,加上這個腳本本身。
利用for循環,給所有目前線上的使用者發送一封郵件
#ScriptName formailit
WHO_ON=`who -u | awk '{print $1}'`
for user in $WHO_ON
mail $user <<MAYDAY
Dear Colleagues,
It's my birthday today, see you down the club
at 17:30 for a drint
See ya.
$LOGNAME
MAYDAY
<<MAYDAY 以MAYDAY開始寫一段内容,直到遇到MAYDAY關鍵字,才會結束,并且不在當地儲存。
執行後的結果,看使用者的郵件
root
=============================
===== for循環嵌套 =====
嵌套循環的格式:
for 變量名1 in 清單1
for 變量2 in 清單2
done
上腳本了
=====================================================================
#ScriptName for_for_loop
APPS="/usr/local/mysql /usr/local/apache2 /usr/local/php5"
SCRIPTS="report.sh cleanup.sh forloop.sh"
LOGFILE=for_for_loop.log
MY_DATE="`date +%H:%M` on `date +%Y-%m-%d`"
for loop in $APPS
for loop2 in $SCRIPTS
echo "System $loop now runing $loop2 at $MY_DATE" | tee -a $LOGFILE
首先定義了兩個變量 APPS和SCRIPTS,MY_DATE這個裡面的指令是格式化時間的,格式化時間都是這樣寫的
date +%H:%M 小時在前,然後一個分号,分鐘在後。
date +%Y-%m-%d 第一個是年,然後一個-然後月,然後-然後是日。因為loop在前面,是以循環的時候,會
先拿loop裡面的第一個清單内容比對loop2清單裡的1,2,3.然後是loop裡的第二個内容比對loop2的1,2
,3一直到兩個裡面都比對完,循環結束。運作結果
[root@localhost Shell]# sh for_for_loop.sh
System /usr/local/mysql now runing report.sh at 17:45 on 2011-08-11
System /usr/local/mysql now runing cleanup.sh at 17:45 on 2011-08-11
System /usr/local/mysql now runing forloop.sh at 17:45 on 2011-08-11
System /usr/local/apache2 now runing report.sh at 17:45 on 2011-08-11
System /usr/local/apache2 now runing cleanup.sh at 17:45 on 2011-08-11
System /usr/local/apache2 now runing forloop.sh at 17:45 on 2011-08-11
System /usr/local/php5 now runing report.sh at 17:45 on 2011-08-11
System /usr/local/php5 now runing cleanup.sh at 17:45 on 2011-08-11
System /usr/local/php5 now runing forloop.sh at 17:45 on 2011-08-11
=========================================================================
======= UNTIL循環 =======
until循環執行一系列指令,直到條件為真是停止。until循環與while循環在處理方式上剛好相反。
一般while循環優于until循環,但在某些時候,也隻是極少情況下,until循環更加有用。
until循環格式為
========================
until 條件
指令1
.....
條件可為任意測試條件,測試發生在循環末尾,因些循環至少執行一次(循環至少執行一次,注意。)
簡單until循環 這段腳本不斷的搜尋who指令中使用者root,變量IS-ROOT儲存grep指令結果。
如果找到了root,循環結束,并向使用者admin發送郵件,通知他使用者root已經登入,注意這裡sleep指令
,它經常用于until循環中,因為必須讓循環休内的指令睡眠幾秒種再執行,否則會消消耗大量系統資源
#ScriptName until_who
IS_ROOT=`who | grep root`
until [ "$IS_ROOT" ]
sleep 5
echo "Watch it . roots in " | mail admin
執行結果:
Watch it . roots in
使用until循環監視磁盤空間
until循環做監視條件也很有用。假定要監視檔案系統容量。當它達到一定百分比時通知管理者
下面的腳本監視檔案系統/logs,不斷從變量$LOOK_OUT中抽取資訊,如果容量達到了90%,觸發指令部分
向超級使用者發送郵件,腳本退出
===========================================================
#until_mon
LOOK_OUT=`df | grep /logs | awk '{print $5}' | sed 's/%//g'`
echo $LOOK_OUT
until [ "$LOOK_OUT" -gt "90" ]
do
echo "Filesystem..logs is nearly full" | mail root
exit0
===== while循環 ======
while循環用于不斷執行一系列指令,也用于從輸入檔案中讀取資料,其格式為:
====================================
while 指令
指令2
......
雖然通常隻使用一個指令,但在while和do之間,可以放幾個指令。指令通常用作測試條件
隻有當指令的退出狀态為0時,do和done之間指令才被執行,如果退出狀态不是0,則循環終止
指令執行完畢,控制傳回循環頂部,從頭開始直至測試條件為假。
簡單while循環
#ScriptName whilecount
COUNTER=0
while [ $COUNTER -lt 5 ]
COUNTER=`expr $COUNTER + 1`
echo $COUNTER
首先定義COUNTER的值為0,然後進入while循環,while後面是一個判斷,判斷COUNTER的值是不是
小于等于5,第一次的時候是0,是以條件成立,進入到while循環,然後對COUNTER進行計算,在目前
值的基礎上加1,然後用echo輸出值,第一次0+1是1,是以WHILE會接着判斷,還是小于5,接着循環。
一直到值為5,條件不成立,退出循環。那麼,現在執行的結果就很明顯了
[root@localhost Shell]# sh whilecount.sh
#ScriptName whileread
echo "Type <CTRL-D> to terminate"
echo -n "Enter your most liked film : "
while read FILM
echo "Yeah,great film the $FILM"
一直不停的讀使用者的輸入,然後輸入Yeah,great film the (使用者輸入的名字)
直到使用者按CTRL+D,腳本結束。
#####################################
#Whileread2
while read ONE
echo $ONE
done < names.txt
#######################
循環讀變量ONE,然後輸出變量ONE,變量的來源由names.txt檔案來傳遞。其實就是列印names.txt檔案的
内容 ,跟使用指令cat naes.txt得到的結果一樣
[root@localhost Shell]# cat names.txt
Louise Conrad:Accounts:ACC8987
Peter James:Payroll:PR489
Fred Terms:Customer:CUS012
James Lenod:Accounts:ACC887
Frank Pavely:Payroll:PR489
###
[root@localhost Shell]# sh whileread2.sh
============
使用IFS讀檔案
輸出時要去除冒号域分隔符,可以使用變量IFS。在改變它之前儲存IFS的目前設定,然後在腳本
執行完後恢複此設定,使用IFS可以将域分隔符改為冒号而不是空格或tab鍵。這裡有3個域需要
加域分隔,即NAME、DEPT和ID。
為使輸出看起來更清晰,對echo指令使用tab鍵将域分隔得更開一些,腳本如下:
#ScriptName whilereadifs
SAVEDIFS=$IFS
IFS=:
while read NAME DEPT ID
echo -e "$NAME\t $DEPT\t $ID"
done <names.txt
NFS=$SAVEDIFS
==================
#ScriptName whileread_file
HOLD_FILE=hold_file
NAME_MATCH="James Lenod"
INPUT_FILE=names.txt
>$HOLD_FILE
while read NAME DEPT TD
echo $NAME $DEPT $TD >>$HOLD_FILE
IF [ "$NAME" = "$NAME_MATCH" ]; then
echo "All entries up to and including $NAME_MATCH are in $HOLD_FILE"
exit 0
done < $INPUT_FILE
IFS=$SAVEDIFS
==============================================================
每次讀一對記錄
有時可能希望每次處理兩個記錄,也許可從記錄中進行不同域的比較。每次讀兩個記錄很容易
就是要在第一個while語句之後将第二個語句放在其後
[root@localhost Shell]# vi record.txt
record 1
record 2
record 3
record 4
record 5
record 6
—————————————————————
_______________________________________________
[root@localhost Shell]# vi readpair.sh
#ScriptName readpair
while read rec1
read rec2
echo "This is record one of a pair :$rec1"
echo "This is record one of a pair :$rec2"
echo "_____________________________________"
done < record.txt
[root@localhost Shell]# sh readpair.sh
This is record one of a pair :record 1
This is record one of a pair :record 2
_____________________________________
This is record one of a pair :record 3
This is record one of a pair :record 4
This is record one of a pair :record 5
This is record one of a pair :record 6
break
break指令允許跳出循環。break通常在進行一些處理後,退出循環或case語句。如果在一
個嵌入循環裡,可以指定跳出的循環個數。如果在兩層循環内,用break 2剛好跳出整個循環。
跳出case語句,下面例子中,腳本進入死循環直到使用者輸入數字大于5,要跳出這個循環
傳回到shell提示符下
========================================================
#ScriptName breakout
while :
echo -n "Enter any number [1..5] :"
1|2|3|4|5) echo "Great you entered a number between 1 and 5"
*) echo "Wrong number..bye"
=========================================================
上例中,使用者輸入1-5之間的數字,都會被echo輸出,如果輸入其它,剛會到break指令
跳出循環。如果沒有break,那麼就一直循環,因為while沒有指定條件,無論輸入什麼,都滿足
continue
continue 指令類似于break指令,隻有一點重要差别,它不會跳出循環,隻是跳過這個循環步。
#ScriptName whilecontinue
INPUT_FILE=names2.txt
NAME_HOLD="Peter James"
LINE_NO=0
if [ -s $INPUT_FILE ]; then
while read NAME DEPT ID
LINE_NO=`expr $LINE_NO + 1`
if [ "$LINE_NO" -le 2 ]; then
if [ "$NAME" = "$NAME_HOLD" ]; then
echo "Now processing... $NAME $DEPT $ID"
echo "$0 : Sorry, file not found or there is not data in the file"
========================================================================
#ScriptName menu
#DATE:2011-08-12
MYDATE=`date -d today +"%Y-%m-%d %H:%M:%S"`
THIS_HOST=`hostname -s`
USER=`whoami`
#Loop forever
#Clear the screen
tput clear
cat <<MYDAY
______________________________________________________________
USER: $USER HOST: $THIS_HOST DATE: $MYDATE
1: List files in current directory
2: Use the vi editor
3: See who is on the system
H: Help screen
Q: Exit Menu
MYDAY
#Here document finished
echo -e -n "\tYour Choice [1,2,3,H,Q]>"
read CHOICE
case $CHOICE in
1) ls
2) vi
3) who
H|h)
#Use a here document for the help screen
This is the help screen, nothing here yet to help you!
Q|q) exit 0
*) echo -e "\t\007Unknown user response"
echo -e -n "\tHit the return key to continue"
read DUMMY