天天看點

shell常用語句總結

流控制:

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關鍵字,才會結束,并且不在當地儲存。

執行後的結果,看使用者的郵件

To: [email protected]

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

執行結果:

To: [email protected]

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