Bash 无法停止在Shell脚本中读取

Bash 无法停止在Shell脚本中读取,bash,Bash,对于最后一个项目,我尝试创建一个shell脚本,它将允许用户轻松创建。要求包括我从文件中读取信息,并基于该文件创建用户。这是我遇到问题的一段代码 echo -n "Please provide a path to the file containing these parameters: " read inputPath fileInfo = $(grep $inputPath) if [ -n "$fileInfo" ]; then IFS="," read firstNam

对于最后一个项目,我尝试创建一个shell脚本,它将允许用户轻松创建。要求包括我从文件中读取信息,并基于该文件创建用户。这是我遇到问题的一段代码

echo -n "Please provide a path to the file containing these parameters: "
read inputPath 

fileInfo = $(grep $inputPath) 

if [ -n "$fileInfo" ]; then 
    IFS="," read firstName lastName phoneNo emailAd < "$fileInfo" 
else
    echo "Cannot read, file is empty." >&2 
    exit 1
fi
echo-n“请提供包含以下参数的文件的路径:”
读取输入路径
fileInfo=$(grep$inputPath)
如果[-n“$fileInfo”];然后
IFS=“,”读取firstName lastName phoneNo emailAd<“$fileInfo”
其他的
echo“无法读取,文件为空。”>&2
出口1
fi
读取inputPath后,它不会停止接受输入并继续下一行代码。我完全被难住了


谢谢你看

作为赋值语句,这根本不起作用:

fileInfo = $(grep $inputPath) 
shell在赋值中不允许在
=
周围使用空格。即使我们解决了这个问题,我们仍然会有另一个问题:

fileInfo=$(grep $inputPath) 
如果
inputPath
是一个没有空格的路径,则
grep
将在stdin中查找该字符串,并将继续查找,直到您按ctrl-D关闭stdin

您可以通过在命令提示下进行尝试来演示这一点:

$ inputPath=/usr/bin/python
$ grep $inputPath
shell将等待您提供输入

很可能,您想在文件中搜索名称为
$inputPath
的内容:

fileInfo=$(grep something "$inputPath") 
请注意,我们引用了
inputPath
,以防止分词和路径名扩展

有关使用空格的命令的详细信息 让我们再看一次:

fileInfo = $(grep $inputPath) 
如果shell看到此命令,它将尝试使用第一个参数
=
运行命令
fileInfo
,其余参数是对
$(grep$inputPath)
生成的任何对象进行单词拆分和路径名扩展的结果。但是,要做到这一点,正如Jonathan Leffler在评论中指出的那样,shell必须首先运行
grep$inputPath
。只要
$inputPath
不包含空格,则
grep
将读取stdin,以查找与
$inputPath
值匹配的文本。除非键入ctrl-D,否则shell将显示为挂起在此处


换句话说,尽管带有额外空格的命令版本存在多个问题,但要注意的第一个问题是
grep
正在等待stdin。

请看一看:另一个问题是grep表达式不完整。我看到了
grep
,我假设正则表达式是
$inputPath
,但后来应用到了什么?(编辑修复它)请注意,分隔开的表达式将“运行”,但将首先运行
grep
,因此不会注意到可能没有名为
fileInfo
的命令,除非键入control-D以指示EOF。
$(grep$inputPath)
是故障的主要原因。基本的技术可以证明是
grep
而不是
read
引起了麻烦。@JonathanLeffler很有意思。答案更新了,讨论了这一点。