Bash 在"do < {$1}"上返回不明确的重定向错误



我正在读一本编程书,偶然发现了这个例子

#!/bin/bash
# read file and create INSERT statements for MySQL
#
outfile='members.sql'
IFS=','
while read lname fname address city state zip
do
cat >> $outfile << EOF
INSERT INTO members (lname,fname,address,city,state,zip) 
VALUES ('$lname', '$fname', '$address', '$city', '$state', '$zip');
EOF
done < ${1}

在包含的同一目录中使用members.csv文件

Monster,Cookie,123 Pastry Ln,Detroit,MI,66666

Bash返回

./test23.sh: line 11: ${1}: ambiguous redirect

作为运行时

./test23.sh < members.csv

该文件中的所有内容都与我2015年的编程书中的内容完全匹配。我尝试了很多不同的{}(($空格和无空格组合,但最终总是会出现不明确的重定向错误。这一切都是通过emacsshell在/bin/bash上运行的,但我退出了emacs,并通过父LXTerminal进行了尝试,但它仍然会给我同样的错误。我已经尝试过members.csv文件,无论是否具有读写和执行权限,并确保test23.sh上的权限是正确的,我迷路了。

第1版:好吧,伙计们,在shell和bash版本中使用这个脚本的正确方法是

done >"$1"

在修复语法后,我将其作为运行

./test23.sh members.csv

在没有任何额外重定向的情况下,输出到members.sql是

INSERT INTO members (lname,fname,address,city,state,zip) VALUES 
('Blum', 'Richard', '123 Main St.', 'Chicago', 'IL', '60601');
INSERT INTO members (lname,fname,address,city,state,zip) VALUES 
('Blum', 'Barbara', '123 Main St.', 'Chicago', 'IL', '60601');
INSERT INTO members (lname,fname,address,city,state,zip) VALUES 
('Bresnahan', 'Christine', '456 Oak Ave.', 'Columbus', 'OH', '43201');

您需要在调用中去掉<。试试这个:

./test23.sh  members.csv

对我有用。

编辑:感谢Charles Duffy

对于跨版本的可操作性,最好在bash脚本中的位置参数访问周围添加引号,因此底线可以变成:

done < "${1}"

done < "$1"

重定向是"不明确的",因为您的$1是空的:您根本没有向脚本传递参数,因为<members.csv不是脚本的参数——它是shell在启动脚本之前如何配置stdin的指令

您应该执行任一两件事中的一件,但不能同时执行

  • 通过运行./test23.sh members.csvmembers.csv作为参数传递,并将重定向上的引号固定为<"$1",以便所有shell版本都能正确解析它
  • 通过运行./test23.sh <members.csv连接stdin上的members.csv,但不要在脚本中使用重定向(因为父shell在启动脚本之前就已经完成了重定向(

最新更新