Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux Bash,如何检查变量中的控制字符(不可打印字符)?_Linux_Bash - Fatal编程技术网

Linux Bash,如何检查变量中的控制字符(不可打印字符)?

Linux Bash,如何检查变量中的控制字符(不可打印字符)?,linux,bash,Linux,Bash,我有一个Bash语句,可以让用户将单个字符输入到tmpchar中: 我可以像这样检查可打印字符输入: if [ "$tmpchar" = "n" ] || [ "$tmpchar" = "N" ]; then # do something... fi 现在我的问题是:如果用户输入的只是一个回车,或者ESC,或者Ctrl+a,Ctrl+b等等,我如何检查它们 ENV:opensuse12.3,bash4.2.421-release也许您正在寻找。例如,Ctrl-a表示为$'\ca.使用正则表

我有一个Bash语句,可以让用户将单个字符输入到tmpchar中:

我可以像这样检查可打印字符输入:

if [ "$tmpchar" = "n" ] || [ "$tmpchar" = "N" ]; then
  # do something...
fi
现在我的问题是:如果用户输入的只是一个回车,或者ESC,或者Ctrl+a,Ctrl+b等等,我如何检查它们


ENV:opensuse12.3,bash4.2.421-release

也许您正在寻找。例如,Ctrl-a表示为$'\ca.

使用正则表达式匹配运算符=~在[…]内:

请注意,read-n1不会像您期望的那样处理各种特殊字符。至少,您应该使用:

IFS= read -r -n1

即使这样,您也不会看到换行符:如果键入换行符,read会将reply变量设置为空字符串。

您可以使用tr过滤输入:


如果要知道某个字符是否不是可打印字符集的成员,请使用补充集表达式。这似乎适用于以下情况:

输出可打印和不可打印


同样有效。如果您想知道您的系统支持哪些字符集,请查看linux上的man 7 regex或OS X上的man 7 re_格式。

我发现了一个检查唯一返回输入的技巧

if [ "$tmpchar" = "$(echo -e '')" ]; then
  echo "You just pressed Return."
fi
换言之,@ooga高度期待的方式

if [ "$tmpchar" = $'\x0a' ]; then
  echo "You just pressed Return." # Oops!
fi

无论如何都不适合退货,很难解释。

这正是我要找的。
read -n 1 -t 1 tmpchar
clean=$(tr -cd '[:print:]' <<< $tmpchar)
if [ -z "$clean"]; then
    echo "No printable"
else
    echo "$clean"
fi
for c in $'\x20' $'\x19'; do
    case "$c" in
        [[:print:]]) echo printable;;
        [^[:print:]]) echo 'not printable';;
        *) echo 'more than one character?';;
    esac
done
for c in $'\x20' $'\x19'; do
    if [[ $c = [[:print:]] ]]; then
        echo printable
    fi
    if [[ $c = [^[:print:]] ]]; then
        echo not printable
    fi
done
if [ "$tmpchar" = "$(echo -e '')" ]; then
  echo "You just pressed Return."
fi
if [ "$tmpchar" = $'\x0a' ]; then
  echo "You just pressed Return." # Oops!
fi