shell学习与使用,边学边用之五!(实现一个简单的通讯录)
banxi1988@banxi:~/work/shell$ cat addrList.sh #!/bin/bash# addrList.sh# 实现一个简单的通讯录程序,联系人信息的添加,修改,删除,查找等操作。# ## 显示菜单#declare operation; ## TODO use global vardeclare QUIT_FLAG;let QUIT_FLAG="0";#export QUIT_FLAGshowMenu() {echo "====================================================";echo "| ***************我的通讯录************************|";echo "====================================================";echo "|[添加联系人(add)] | [编辑联系人(edit n)] |";echo "|[查找联系人(find)] | [删除联系人(delete n)] |";echo "|[查看全部(all)] | [查看前面n位(list n)] |";echo "|[退出程序(quit)] | [查看前面n位(list n)] |";echo "====================================================";echo -n "***请输出操作命令>";}selectOperation() {read operationecho "正在执行命令: $operation...";#set -xif [ $operation = "add" ]thenecho -n "请输入联系人姓名:>";read name;echo -n "请输入联系人电话号码:>";read phoneecho "$name $phone" >> my_addr_list.txtelif [ $operation = "edit" ]thenecho "暂时没有实现"elif [ $operation = "find" ]thenecho "prepare find...";elif [ $operation = "delete" ]thenecho "prepare delete...";elif [ $operation = "all" ]thenecho "正在读取...";cat my_addr_list.txtelif [ $operation = "list" ]thenecho "list...";elif [ $operation = "quit" ]thenset -xQUIT_FLAG="1"; ## quitset +xelseecho "WRONG:no such menu choice!";fiset +x}main() {set -x ## for debugecho $quitwhile [ "$QUIT_FLAG" -eq 0 ]doset +xshowMenu;selectOperation;done;}main
测试运行结果如下:
banxi1988@banxi:~/work/shell$ bash addrList.sh + echo+ '[' 0 -eq 0 ']'+ set +x====================================================| ***************我的通讯录************************|====================================================|[添加联系人(add)] | [编辑联系人(edit n)] ||[查找联系人(find)] | [删除联系人(delete n)] ||[查看全部(all)] | [查看前面n位(list n)] ||[退出程序(quit)] | [查看前面n位(list n)] |====================================================***请输出操作命令>quit正在执行命令: quit...+ QUIT_FLAG=1+ set +xbanxi1988@banxi:~/work/shell$ bash addrList.sh + echo+ '[' 0 -eq 0 ']'+ set +x====================================================| ***************我的通讯录************************|====================================================|[添加联系人(add)] | [编辑联系人(edit n)] ||[查找联系人(find)] | [删除联系人(delete n)] ||[查看全部(all)] | [查看前面n位(list n)] ||[退出程序(quit)] | [查看前面n位(list n)] |====================================================***请输出操作命令>edit正在执行命令: edit...暂时没有实现====================================================| ***************我的通讯录************************|====================================================|[添加联系人(add)] | [编辑联系人(edit n)] ||[查找联系人(find)] | [删除联系人(delete n)] ||[查看全部(all)] | [查看前面n位(list n)] ||[退出程序(quit)] | [查看前面n位(list n)] |====================================================***请输出操作命令>quit正在执行命令: quit...+ QUIT_FLAG=1+ set +x
上面的代码中,在做菜单功能中全局变量 QUIT_FLAG花了我很多的时间,应该开始这个全局变量就是不全局。还见到一本书上在quit命令的if分支用
$QUIT_FLAG="1"来赋值。这样做在我这里的测试中是有问题吧。
修改之后将代码结构调整之后,如下:
#!/bin/bash# addrList.sh# 实现一个简单的通讯录程序,联系人信息的添加,修改,删除,查找等操作。# ## 显示菜单#declare operation; ## TODO use global vardeclare QUIT_FLAG;let QUIT_FLAG="0";#export QUIT_FLAGshowMenu() {echo "====================================================";echo "| ***************我的通讯录************************|";echo "====================================================";echo "|[添加联系人(add)] | [编辑联系人(edit n)] |";echo "|[查找联系人(find)] | [删除联系人(delete n)] |";echo "|[查看全部(all)] | [查看前面n位(list n)] |";echo "|[退出程序(quit)] | [查看前面n位(list n)] |";echo "====================================================";echo -n "***请输出操作命令>";}selectOperation() {read operationecho "正在执行命令: $operation...";#set -xif [ $operation = "add" ]thendoAdd ## doAdd()elif [ $operation = "edit" ]thenecho "暂时没有实现"elif [ $operation = "find" ]thendoFind ## doFind() elif [ $operation = "delete" ]thenecho "prepare delete...";elif [ $operation = "all" ]thendoAll ## doAll()elif [ $operation = "list" ]thenecho "list...";elif [ $operation = "quit" ]thenset -xQUIT_FLAG="1"; ## quitset +xelseecho "WRONG:no such menu choice!";fiset +x}doAdd() {echo "do add...";echo -n "请输入联系人姓名:>";read name;echo -n "请输入联系人电话号码:>";read phoneecho "$name $phone" >> my_addr_list.txt}doFind() {echo -n "请输入查找条件:>";read cond;### TODO judge if my_addr_list.txt is existsif [ -e my_addr_list.txt ]thenecho `grep -in $cond my_addr_list.txt`elseecho "通讯录暂时为空";fi}doAll() {if [ -e my_addr_list.txt ]thenecho "===================所有联系人信息如下:============";echo cat my_addr_list.txtecho "===================================================";elseecho "通讯录暂时为空";fi}main() {set -x ## for debugecho $quitwhile [ "$QUIT_FLAG" -eq 0 ]doset +xshowMenu;selectOperation;done;}main============未完待续===============