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
):
dos2unix
的实用程序删除这些行结尾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'}"