Ubuntu 更换时出现问题

Ubuntu 更换时出现问题,ubuntu,sh,Ubuntu,Sh,我在发布之前进行了搜索,但找不到任何匹配的问题。看起来我的查找和替换正在向结尾添加一个无法删除的返回字符。调用为sh csv2postgres.sh导入树引用,其中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_referen

我在发布之前进行了搜索,但找不到任何匹配的问题。看起来我的查找和替换正在向结尾添加一个无法删除的返回字符。调用为
sh csv2postgres.sh导入树引用
,其中
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
而不是
cname
并将命令更改为
sh csv2postgres.sh import_tree_references
,则
head
命令工作正常,但我正在使用的应用程序仍将通过烤肉串案例

我在ubuntu 18.10上


有什么建议吗?

出现
\r
表明微软Windows不知何故参与其中

这里有三个选项:

  • 一种方法是改变:

    cname=$(printf $1 | sed -e "s/-/_/g")
    
    致:

    这将删除有问题的
    \r

    (请注意,除非您明确希望使用shell扩展,否则所有对shell变量的引用,如上面的
    $1
    ,都应使用双引号。)

  • 如果您使用的是
    bash
    ,而不是
    sh
    ,则无需使用管道和调用外部实用程序(
    sed
    ):

  • 第三种方法是查找任何具有Windows行结尾的文件,并使用类似于
    dos2unix
    的实用程序删除这些行结尾

  • 注意:sh不是bash 在许多系统中,
    sh
    是指向
    bash
    的符号链接,但这并不意味着
    sh
    的行为类似于
    bash
    。为了与以前名为
    sh
    的程序兼容,当以
    sh
    的名称调用时,bash的高级功能将被关闭,并且bash尝试模拟早期功能较差的shell

    manbash

    如果使用名称
    sh
    调用
    bash
    ,它将尝试模拟
    sh
    历史版本的启动行为尽可能接近 可能,同时也符合POSIX标准


    我更喜欢最后一种方式,但出于某种原因,她不喜欢。这对我来说很奇怪,因为bash只是sh的一个符号。不管你怎么说,如果你的脚本文件有DOS行结尾,症状都会与你看到的完全一致,否则很难解释。请仔细检查一下。@Triplee你明白了。dos结尾在脚本文件中。windows上一定有人打开了它并输入了新的行尾。然后请(可能是向上投票,然后才接受这个答案)接受重复的提名。@blindguy
    bash
    sh
    是不同的,即使
    sh
    是指向
    bash
    的符号链接。我在答案的末尾添加了一个关于这一点的部分,并提供了更多细节。
    cname=$(printf "$1" | sed -e "s/\r//g; s/-/_/g")
    
    cname="${1//-/_}"
    cname="${cname%%$'\r'}"