不确定我是否应该将它放在stackoverflow或unix.stackexchange上,但我在这里找到了一些similar questions,所以就这样了。
我试图创建一个由.bashrc调用的脚本,它允许我根据一次击键选择两个选项中的一个。这通常不会很难但我希望对应于这两个选项的两个键是空格并输入。
这是我到目前为止所得到的:
#!/bin/bash
SELECT=""
while [[ "$SELECT" != $'\x0a' && "$SELECT" != $'\x20' ]]; do
echo "Select session type:"
echo "Press <Enter> to do foo"
echo "Press <Space> to do bar"
read -s -N 1 SELECT
echo "Debug/$SELECT/${#SELECT}"
[[ "$SELECT" == $'\x0a' ]] && echo "enter" # do foo
[[ "$SELECT" == $'\x20' ]] && echo "space" # do bar
done
如果我按下enter,space,backspace和x:
,我得到的是以下输出:~$ bin/sessionSelect.sh
Select session type:
Press <Enter> to start/resume a screen session
Press <Space> for a regular ssh session
Debug//0
Select session type:
Press <Enter> to start/resume a screen session
Press <Space> for a regular ssh session
Debug//0
Select session type:
Press <Enter> to start/resume a screen session
Press <Space> for a regular ssh session
Debug//1
Select session type:
Press <Enter> to start/resume a screen session
Press <Space> for a regular ssh session
Debug/x/1
因此,输入和空格都会产生一个空的SELECT。无法区分这两者。我试图添加-d&#39; D&#39;阅读选项,但没有帮助。也许有人可以指出我正确的方向。
bash版本是4.2 btw。
答案 0 :(得分:3)
#!/bin/bash
SELECT=""
# prevent parsing of the input line
IFS=''
while [[ "$SELECT" != $'\x0a' && "$SELECT" != $'\x20' ]]; do
echo "Select session type:"
echo "Press <Enter> to do foo"
echo "Press <Space> to do bar"
read -s -N 1 SELECT
echo "Debug/$SELECT/${#SELECT}"
[[ "$SELECT" == $'\x0a' ]] && echo "enter" # do foo
[[ "$SELECT" == $'\x20' ]] && echo "space" # do bar
done
答案 1 :(得分:3)
尝试将读取分隔符设置为空字符串,然后检查内置$ REPLY变量:
read -d'' -s -n1
出于某种原因,我无法指定变量。
答案 2 :(得分:2)
read
有几件与此相关的内容:
由于你正在阅读一个字符,这意味着输入 Enter 将导致一个空变量。
此外,默认情况下,单词拆分规则,输入 Space 也会产生一个空变量。好消息是你可以通过设置IFS
来处理这部分。
将您的read
声明更改为:
IFS= read -s -n 1 SELECT
输入 Enter 时,并期望一个空字符串而不是$'\x0a'
。