bash读取命令 - 如何接受控制字符



我正在使用以下内容读取用户的一堆参数。

read -p "Name`echo $'n> '`" NAME

我所有的参数都有默认值。我想为用户提供一个选择,以跳过任何时候提供值。即用户可以为第一个3个参数提供值,然后按 ctrl s 跳过输入其余部分的值。

我如何陷阱 ctrl s

ctrl s是终端滚动锁定字符,尚未立即可用。您有两个选择:

  • 与系统一起使用,使用系统标准密钥组合,并使自己和其他所有人的生活更轻松。

  • 与系统进行战斗,坚持使用此键组合,尽一切努力使其实现,然后忍受后果。

如果要与系统一起工作,请考虑使用空白行和/或CTRL D,该线已被广泛用于结束输入。这很容易且健壮:

if read -p "Name (or blank for done)"$'n> ' name && [[ $name ]]
then
  echo "User entered $name"
else
  echo "User is done entering things"
fi

另外,这是对抗系统的开始:

#!/bin/bash
settings=$(stty -g)
echo "Enter name or ctrl+s to stop:"
stty stop undef    # or 'stty raw' to read other control chars
str=""
while IFS= read -r -n 1 c && [[ $c ]]
do
  [[ $c = $'x13' ]] && echo "Ctrl+S pressed" && break
  str+="$c"
done
echo "Input was $str"
stty "$settings"

当用户在标准配置上击中CTRL S时,这将正确结束,但是由于它与系统不起作用,因此需要其他工作来支持适当的行编辑和较不常见的配置。

不确定陷阱的意思。用户可以通过键入Ctrl V和Ctrl S输入CTRL S,然后您的脚本可以进行检查:

if [[ $NAME == '^S' ]]; then
  ...
  # skip asking for more values and continue with default values
fi

最新更新