无法在Shell脚本中停止读取

时间:2016-07-28 05:41:20

标签: 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 firstName lastName phoneNo emailAd < "$fileInfo" 
else
    echo "Cannot read, file is empty." >&2 
    exit 1
fi

读取inputPath 后,它不会停止接受输入并继续下一行代码。我完全难过了。

谢谢你看看。

1 个答案:

答案 0 :(得分:2)

这根本不能作为赋值语句使用:

fileInfo = $(grep $inputPath) 

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

fileInfo=$(grep $inputPath) 

如果inputPath是一个没有空格的路径,那么grep将在stdin中查找该字符串,它将继续查找,直到您按ctrl-D关闭标准输入。

您可以通过在命令提示符处尝试来证明这一点:

$ inputPath=/usr/bin/python
$ grep $inputPath

shell会等你提供输入。

最有可能的是,您希望在名称为$inputPath的文件中搜索某些内容:

fileInfo=$(grep something "$inputPath") 

请注意,我们引用inputPath来阻止分词和路径名扩展。

更多关于带空格的命令

让我们再看一遍:

fileInfo = $(grep $inputPath) 

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

换句话说,即使带有额外空格的命令版本存在多个问题,第一个问题仍然是$inputPath正在等待标准输入。