本地运行shell脚本失败

3

我有一个shell脚本在这里在线上可以运行,但是在本地终端上无法运行。可能的原因是什么?我应该如何调试?

#!/bin/bash

string='internal func add() -> Int'

sed -e '
s/^.*func \+//
s/ *\->.*$//
s/:[^,)]\+/:/g
s/[, ]//g
' <<< "$string"

echo $SHELL

对于在shell脚本中出现的输入,我在本地计算机上得到了internalfuncadd(),而在线上正确的输出结果应该是add()


尝试在您的文件上使用 dos2unix。您使用 sed 的方式对行终止符很敏感。 - Jean-François Fabre
有没有办法去除这些敏感的终止符?我对sed和脚本不太熟悉。 - prabodhprakash
我执行了 dos2unix fnmod.sh,其中 fnmod.sh 是此脚本的文件名。输出保持不变。 - prabodhprakash
哦,当我运行 echo $SHELL 时,我得到的是 /bin/zsh/ 而不是在线上得到的 /bin/sh/,这可能是问题吗?如何强制它在 /bin/sh 上运行? - prabodhprakash
你使用的是Linux,或者是BSD或Mac OS X吗?我可以在FreeBSD上重现这个错误。 - Wintermute
显示剩余2条评论
1个回答

3
你的问题是你正在使用 BSD sed(Mac OS X 自带的),而不是 GNU sed(通常在 Linux 上找到的)。BSD sed 不支持 GNU sed 的某些功能,包括基本正则表达式中的 \+。你可以使用 \{1,\} 代替:
#!/bin/bash

string='internal func add() -> Int'

sed -e '
s/^.*func \{1,\}//
s/ *\->.*$//
s/:[^,)]\{1,\}/:/g
s/[, ]//g
' <<< "$string"

...或者使用-E切换到扩展正则表达式,尽管这将要求使用该语法编写正则表达式。(在这种特定情况下,需要的更改是使用+而不是\+\+在扩展语法中表示一个字面上的+)


哦,太棒了,它工作了!你能帮我提供一些链接来理解这些东西吗? - prabodhprakash
很遗憾,我不知道GNU sed和BSD sed之间的差异的全面列表。 - Wintermute
3
我可以给你的是 POSIX 标准中关于 sed 和正则表达式部分的链接:http://pubs.opengroup.org/onlinepubs/009695399/utilities/sed.html 和 http://pubs.opengroup.org/onlinepubs/7908799/xbd/re.html -- 所有种类的 sed 都应该支持这些内容。不过,BSD 和 GNU 的 sed 以不同的方式扩展了 POSIX。希望这能对你有所帮助。 - Wintermute
很好。@prabodhprakash:我尝试在此回答中总结了所有差异。 - mklement0
1
感谢 @mklement0 - 这很有用。 - prabodhprakash
1
@mklement0 我现在可能已经链接到这个答案30次了 ;) - Benjamin W.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接