我对shell编程很新...并且正在开发项目
正在使用Select Case
是脚本
#! /usr/bin/bash
echo "1) Add new book"
echo "2) Remove existing book info"
echo "3) Update book info and quantity"
echo "4) Search for book by title/author"
echo "5) Process a book sold"
echo "6) Inventory summary report"
echo "7) Quit"
PS3="Please enter your option: "
select book in Add Remove update search process inventory quit
#read book
do
case $book in
1) echo "Add new book"
echo "Title: "
read title
echo $title > BookDB.txt
echo "Author: "
read name
echo $name > BookDB.txt
echo "$title successfully added!"
break
;;
2) echo "Remove existing book info"
sed '$NAME' BookDB.txt
break
;;
3) echo "Update book info and quantity"
echo "Title: "
read title
echo $title < BookDB.txt
echo "Author: "
read name
echo $name < BookDB.txt
break
;;
4) echo "Search for book by title/author"
break
;;
5) echo "Process a book sold"
break
;;
6) echo "Inventory summary report"
break
;;
7) echo "Quit"
exit
;;
esac
done
及以下是shell commands
Ubuntu terminal
1) Add new book
2) Remove existing book info
3) Update book info and quantity
4) Search for book by title/author
5) Process a book sold
6) Inventory summary report
7) Quit
1) Add 3) update 5) process 7) quit
2) Remove 4) search 6) inventory
Please enter your option: 1
Please enter your option:
我输入后echo
中的单词不会出现。即使我选择退出,它也不会返回菜单。我怎么让它工作? :(
非常感谢任何帮助。谢谢! :)
答案 0 :(得分:2)
从bash
联机帮助页(我的斜体和粗体):
select name [ in word ] ; do list ; done
展开后面的单词列表,生成项目列表。扩展单词集打印在标准错误上,每个单词前面都有一个数字。如果省略in字,则打印位置参数(参见下面的参数)。
然后显示PS3提示并从标准输入读取一行。
如果该行包含与所显示的单词之一对应的数字,则name的值设置为单词。
如果该行为空,则会再次显示单词和提示。如果读取了EOF,则命令完成。
读取任何其他值会导致name设置为null。读取的行保存在变量REPLY中。每次选择后都会执行该列表,直到执行break命令。
select的退出状态是列表中执行的最后一个命令的退出状态,如果没有执行命令则为零。
因此,在您的case
声明中,您需要"Add"
而不是1
,而其他人则需要这样做。
在每种情况下,您还应该查看您实际上正在做什么。显然后者是空的,因为你还没有找到它们,但是你在第二种情况下使用sed
将不会删除文件中的任何内容。并且,对于第三种情况:
echo $title < BookDB.txt
in ...有趣。如果它是输出重定向,我可以理解计划的开头,但是你拥有的行只会输出$title
并完全忽略输入重定向的内容。
毫无疑问,你会及时修复它们,我只是想把它作为需要注意的东西引起你的注意。
答案 1 :(得分:1)
试试这个:
PS3="Please enter your option: "
select book in Add Remove Update Search Process Inventory Quit
do
case $book in
"Add")
...
;;
"Remove")
...
;;
"Update")
...
;;
etc...
esac
done
答案 2 :(得分:0)
替换
select book in Add Remove update search process inventory quit
使用:
select book in 1 2 3 4 5 6 7
答案 3 :(得分:0)
在select语句下,如果你应该使用select中所述的字符串。你应该这样做:
select book in Add Remove update search process inventory quit
do
case $book in
Add) echo "Add new book"
echo "Title: "
read title
echo $title > BookDB.txt
echo "Author: "
read name
echo $name > BookDB.txt
echo "$title successfully added!"
break
;;
Remove) echo "Remove existing book info"
sed '$NAME' BookDB.txt
break
;;
update) echo "Update book info and quantity"
echo "Title: "
read title
echo $title < BookDB.txt
echo "Author: "
read name
echo $name < BookDB.txt
break
;;
search) echo "Search for book by title/author"
break
;;
process) echo "Process a book sold"
break
;;
inventory) echo "Inventory summary report"
break
;;
quit) echo "Quit"
exit
;;
esac
done
您可以理解以下代码:
选择为book准备多个值,分配的值取决于我们输入的内容。输入应该从1开始整数索引。
为了进一步了解,您应该了解bash并选择系统调用。