我有一个写入文件的bash脚本。在脚本的最后我想显示一个带有行号的菜单 - 并让用户能够选择1或2,(等到文件中的行数)然后让它执行该行。 / p>
到此为止是完美的。
然而,在执行该行之后(例如,它显示另一个文件。)我想返回菜单并让用户选择另一个号码。包括退出菜单的零。
显示菜单后,我有以下内容。 (dumpline是读取文件的行)
dresult=`sed -n "$dumpline"p "$PWD"/"$myday1"_"$myjob".txt`
$dresult
但是现在 - 在运行变量$ dresult之后 - 它会退出shell(而不是我喜欢显示的菜单。
有什么想法吗?
提前谢谢。
答案 0 :(得分:2)
这是另一种做依赖于cat
能够对文件行进行编号的菜单的方法(某些版本的cat
可能没有 - 请参阅第二个示例,如果这是案件)。这两个示例都是一个简单的四项菜单:
while [[ 1 ]]
do
cat -n menufile
read -p "Make a selection " choice
case $choice in
1|2)
echo "A or B"
;;
3)
echo "C"
;;
4)
break
;;
*)
echo "Invalid choice"
;;
esac
done
这不需要cat -n
:
saveIFS="$IFS"
IFS=$'\n'
read -d '' -a menuarray < menufile
IFS="$saveIFS"
for (( i=0; i<${#menuarray[@]}; i++ ))
do
menu=$menu"$(($i+1))) ${menuarray[i]}"$'\n'
done
while [[ 1 ]]
do
echo "$menu"
read -p "Make a selection " choice
case $choice in
1|2)
echo "A or B"
;;
3)
echo "C"
;;
4)
break
;;
*)
echo "Invalid choice"
;;
esac
done
答案 1 :(得分:1)
我对 dz 的回答评论太长,无法发表评论,所以我在这里发帖:
将seq
与select
一起使用会产生一个看起来多余的菜单,而它与$dumpfile
中的行显示无关:
ls
echo 'hello'
1) 1
2) 2
etc.
你可以这样做:
saveIFS=$IFS
IFS=$'\n'
menu=$(< $dumpfile)
PS3="Make a selection: "
select ACTION in $menu QUIT
do
IFS=$saveIFS
case ...
答案 2 :(得分:0)
我想,你需要像循环一样的东西。这是一个用于从文件执行选定行的小型骨架:
#!/bin/bash
dumpfile="bla.txt"
echo "ls
echo 'hello'" > ${dumpfile}
function do_action {
line="$( sed -n "${1},1p" "$dumpfile" )"
(
eval "${line}"
)
}
cat -n $dumpfile
nr=$( cat "${dumpfile}" | wc -l )
PS3="select line nr or nr for QUIT: "
select ACTION in $( seq "$nr" ) QUIT
do
case $ACTION in
QUIT) echo "exit" ; break ;; #EXIT
*) do_action "$ACTION" ;;
esac
done
但请注意以下事项: