处理将参数传递到嵌套脚本调用和创建有效的菜单驱动cli的最佳方法



我正在编写一个中心脚本,它充当菜单驱动的cli,通过它我可以根据输入触发其他脚本。

#!/bin/bash
echo "Server Name - `hostname`"
echo "-------------------------------"
echo "     M A I N - M E N U"
echo "-------------------------------"
echo "1. init"
echo "2. insert"
echo "3. show"
echo "4. update"
echo "5. rm"
echo "6. ls"
echo "7. shutdown -> shutdown the server"
while :
do
printf '> '
read -r varname
set -- $varname
case $1 in
init)
./init.sh $2
echo $status
;;
insert)
./insert.sh $2 $3 '' $4
;;
show)
./show.sh $2 $3
;;
update)
./insert.sh $2 $3 'f' $4
;;
rm)
./rm.sh $2 $3
;;
ls)
./ls.sh $2 $3
;;
shutdown)
exit 0
;;
exit)
exit 0
;;
*)
#echo "Error: Bad request"
;;
esac
done

当前:

我有目的地添加了print'>'语句,以便获得与nodecli一样的交互式界面。

插入user1谷歌登录名:blahblah@gmail.com\npass:blah'

  • 插入1美元
  • $2是user1
  • 3美元是谷歌
  • $4是"登录:blahblah@gmail.com\npass:废话

预期:

我希望像运行脚本时传递参数一样读取参数。

例如:

sh add.sh 10 20sh add.sh"10"20">

无论哪种方式,当我们在addshell脚本中读取$1或$2时,我们将获得10和20作为它们的值。

插入user1谷歌登录名:blahblah@gmail.com\npass:blah'

  • 插入1美元
  • $2是user1
  • 3美元是谷歌
  • $4是登录名:blahblah@gmail.com\npass:等等

我不想获取输入,然后删除尾部引号。我希望在运行脚本和传递参数时有确切的行为。

PS:请建议如何获得类似cli的节点,该节点也可以使用向上箭头访问以前运行的命令。

提前感谢

这里的中心思想似乎围绕着以下几行:

read -r varname
set -- $varname

read命令将整行输入读取为文字文本(不允许换行(,并将其记录为变量varname的值,然后扩展该变量以向set内建提供参数。但这并不等同于提供与shell输入相同的命令行。

与该问题特别相关的是,变量扩展产生的引号不会被删除。此外,大括号和波浪号展开发生在变量展开之前,因此它们对您也无效。

你真正想要的似乎是双重扩张。具体来说:

eval "set -- $varname"

请注意,eval非常危险,容易被利用。例如,考虑一下当用户将此命令输入到脚本中时会发生什么(该脚本应该以足够的权限运行以执行系统关闭(:

show pwned; rm -rf /*

最新更新