如何在shell脚本中使用向上箭头键来获取上一个命令

avi*_*hse 3 unix bash shell

我正在尝试编写具有一些基本功能的控制台.这就是我在做的事情.

function help()
{
        echo "add(a,b,...)"
}

function add()
{
arg=$(echo $1 | cut -d"(" -f2)
sum=0
for number in `echo ${arg} | sed -e 's/[,) ]\+/\n/g'` ; do
        sum=$(($sum + $number))
done
echo $sum
}

while true
do

echo -n "mycon@avi>>"
read command
opt=$(echo "$command" | cut -d"(" -f1)
case $opt in
"exit"|"q")
        exit
;;
"help")
        help
;;
"add")
        add $command
;;
esac
done
Run Code Online (Sandbox Code Playgroud)

我在mycon 运行此脚本时保存此文件./mycon

mycon@avi>>add(2,3)
5
mycon@avi>>
Run Code Online (Sandbox Code Playgroud)

现在,在我按下箭头键的那一刻,我想得到上面的add(2,3)命令.这样做的方法是什么?

谢谢

ric*_*ici 6

仅限Bash的解决方案:

  1. 更改read commandread -e commandbash将启用readline库.

  2. 添加命令history -s "$command"以将读取的行包括在历史记录中.

请注意,read command在将行指定给行之前,将从类型化命令中删除尾随空格command,除非您使用IFSset设置为空字符串来调用它.此外,read通常会将反斜杠视为转义字符,这通常是不受欢迎的; 你可以使用-r标志来抑制该行为.最后,您可以read使用该-p选项打印提示,该提示可以更好地使用readline .所以你的最终序列可能如下所示:

while IFS= read -e -p "mycon@avi>> " command; do
  history -s "$command"
  # ... process the command
done
Run Code Online (Sandbox Code Playgroud)

(read如果用户输入EOF字符,则使用该命令作为while语句中的条件会导致while循环终止.)

有关详细信息read,并history使用内置在bash help命令(help read/ help history)