我在发布此消息之前进行了搜索,但是找不到任何匹配的问题。看来我的查找和替换操作在无法删除的末尾添加了一个返回字符。呼叫为sh csv2postgres.sh import-tree-references
,其中csv2postgres.sh
为:
cname=$(printf $1 | sed -e "s/-/_/g")
echo $cname
echo "${cname}.csv"
cols=`head -n 1 "${cname}.csv"`
结果是:
import_tree_references
.csvrt_tree_references
head: cannot open 'import_tree_references'$'\r''.csv'
我尝试了echo / printf,尝试了所有可以想到的“和{}的组合,并尝试添加了管道| tr -d "\r"
。如果我仅使用{{1 }},而不是head
,并将命令更改为$1
,但是我正在使用的应用仍会传递烤肉串。
我正在使用Ubuntu 18.10。
有什么建议吗?
答案 0 :(得分:1)
\r
的存在表明MS Windows以某种方式参与其中。
这是三个选项:
一种方法是更改:
cname=$(printf $1 | sed -e "s/-/_/g")
收件人:
cname=$(printf "$1" | sed -e "s/\r//g; s/-/_/g")
这将删除有问题的\r
。
(请注意,除非您明确希望进行shell扩展,否则所有对shell变量的引用(例如上面的$1
都应使用双引号引起来。)
如果您使用的是bash
,而不是sh
,则可以不必使用管道和对外部实用程序(sed
)的调用:>
cname="${1//-/_}"
cname="${cname%%$'\r'}"
第三种方法是找到具有Windows行尾的任何文件,然后使用dos2unix
之类的实用程序删除这些行尾。
在许多系统中,sh
是到bash
的符号链接,但这不并不意味着sh
的行为类似于bash
。为了与以前的名为sh
的程序兼容,以名称sh
进行调用时,bash的高级功能被关闭,bash试图模仿较早的功能较弱的shell。
来自man bash
:
如果使用名称
bash
调用sh
,它将尝试模仿sh
的历史版本的启动行为与 同时也符合POSIX标准。