Bash read命令-如何接受控制字符

Bash read命令-如何接受控制字符,bash,Bash,我使用下面的代码从用户那里读取一组参数 read -p "Name`echo $'\n> '`" NAME 我的所有参数都有默认值。我想为用户提供一个选项,可以在任何时候跳过提供值。i、 e.用户可以为前3个参数提供值,然后按Ctrl+s键跳过为其余参数输入值 我怎样才能捕获Ctrl+s?不知道你所说的捕获是什么意思。用户可以通过键入Ctrl+V然后键入Ctrl+S来输入Ctrl+S,然后您的脚本可以执行以下检查: if [[ $NAME == '^S' ]]; then ...

我使用下面的代码从用户那里读取一组参数

read -p "Name`echo $'\n> '`" NAME
我的所有参数都有默认值。我想为用户提供一个选项,可以在任何时候跳过提供值。i、 e.用户可以为前3个参数提供值,然后按Ctrl+s键跳过为其余参数输入值


我怎样才能捕获Ctrl+s?

不知道你所说的捕获是什么意思。用户可以通过键入Ctrl+V然后键入Ctrl+S来输入Ctrl+S,然后您的脚本可以执行以下检查:

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

不知道你说的陷阱是什么意思。用户可以通过键入Ctrl+V然后键入Ctrl+S来输入Ctrl+S,然后您的脚本可以执行以下检查:

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

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+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+S已经有了,但我不确定是否可以将其设置为“可捕获”。用户可以通过键入Ctrl+V来输入Ctrl+S,Ctrl+S.Ctrl+[任何字符]对我都有效。想知道如何捕捉信号吗?识别“空输入”意味着“无值”会更容易吗?据我所知,你只能捕捉信号。注意,Ctrl+S已经有了,但我不确定是否可以将其设置为“可捕获”。用户可以通过键入Ctrl+V来输入Ctrl+S,Ctrl+S.Ctrl+[任何字符]对我都有效。想知道如何捕获它吗更容易识别“空输入”是“无值”的意思吗?Ctrl+V在这里做什么?@pc70:control-V表示下一个字符应该被“逐字”处理,作为一个字符,而不是做任何特殊的事情。它抑制了control-D、control-Z、control-C、control-S、control-Q……的特殊含义。Ctrl+V在这里做什么?@pc70:control-V表示下一个字符应该被“逐字”处理,作为一个字符,不做任何特殊的事情。它抑制了control-D、control-Z、control-C、control-S、control-Q等的特殊含义……没有什么比“门1——你会好的。”或“门2——指甲下压着竹子。”——你的选择……没有什么比“门1——你会好的”更简单、更逻辑的了“门#2——把竹子压在指甲底下。”——你的选择。。。