Bash:将读取放入while循环

Bash:将读取放入while循环,bash,Bash,我有一个脚本行为不端,我不知道为什么 #!/bin/bash while read -r;do read -rsn1 inp if ["$inp" = "a"]; then echo "$REPLY" fi done 这将返回: ./some.sh: line 4: [a: command not found 此脚本的目标是在while循环开始时,只要按一次任何键,就从读取返回一行。显然,它目前没有这样做。我知道我理解我在if语句中犯的错误,我正在寻求帮助,接受单用户按键,然后echo从“$

我有一个脚本行为不端,我不知道为什么

#!/bin/bash
while read -r;do
read -rsn1 inp
if ["$inp" = "a"]; then
echo "$REPLY"
fi
done
这将返回:

./some.sh: line 4: [a: command not found

此脚本的目标是在while循环开始时,只要按一次任何键,就从读取返回一行。显然,它目前没有这样做。我知道我理解我在
if
语句中犯的错误,我正在寻求帮助,接受单用户按键,然后
echo
“$REPLY”
中输入一行。感谢您的帮助

bash
if
的语法是:

if command line
then
  commands
fi
因为您没有在括号内留出空格,如果
$inp
“a”
,那么
if
执行的命令是
[a
,它不是已知的内置文件,也不是系统上的可执行文件。当您编写
if[“$inp”=“a”]
时,执行的命令行是
[a=a
;与
test
相同的命令
[
,如果参数中的测试结果为true,则返回
0
(true,非错误)。请参见
man[
;而
bash
内部
[
的行为与
/bin/[/code>相同


这涵盖了错误本身;但逻辑仍然错误,无法实现您所述的目标(如果您也希望得到答案,可以进行一些澄清:如何区分要从要显示的行中前进的键?如果我理解正确的话)

从什么时候开始,我们不在命令和它的第一个参数之间加空格了?我正在为code golf做这个,所以它看起来有点古怪。code golf与否,你不能仅仅发明语法……冒号在
bash
中不是一个东西,你不能因为不方便而省略必需的空格。你是对的,我实际上复制了我输入了正确的分号,并将
do
更改为
,然后
如何检查
inp
是否已填写?我是否可以改为:
read-psn1“$REPLY”
-p
需要一个参数,所以你会在用户面前弹出一个
sn1
的提示…我相信这不是你想要的。
inp
肯定会被填充,因为它将等待一个字符(除非发生EOF)。同样,如果你想要的不仅仅是“如果我的
失败,为什么我的
会失败”,你需要澄清你想要什么。我的脚本的第一部分从
stdin
读取,并逐行返回。现在,我希望每次按下一个键时都有一行出现。这导致我输入第二个
read
,以捕获单个用户的按键,然后
echo
“$REPLY”返回一行
但是你从哪里读到的?STDIN?你说的“来自
“$REPLY”的一行是什么意思?
“$REPLY”的内容是什么“
?当前您的两次读取是从同一个源读取的,因此您的
$inp
将是外部
读取的
读取的下一行的第一个字符。我正在这样做:
cat a|/u file./this_script.sh
。当我的脚本是
!/bin/bash时,读取-r;do echo”$REPLY“done”