对于最终项目,我正在尝试创建一个允许用户轻松创建的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 后,它不会停止接受输入并继续下一行代码。我完全难过了。
谢谢你看看。
答案 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
正在等待标准输入。