Bash 无法停止在Shell脚本中读取
对于最后一个项目,我尝试创建一个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
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很有意思。答案更新了,讨论了这一点。