2013-12-16 48 views
63
#!/bin/bash 

jobname="job_201312161447_0003" 
jobname_pre=${jobname:0:16} 
jobname_post=${jobname:17} 

这个bash脚本给了我在Ubuntu 坏替代错误。任何帮助将不胜感激。庆典:坏换人

+0

这是工作的罚款我出现在这个确切的消息。你想达到什么目的? – fedorqui

+0

我试图将jobname分成两个:job_201312161447和0003.只有当我尝试在ubuntu上运行此命令时才会发生此错误。 –

+0

嗯奇怪。如果你使用'cut'会怎么样?'cut -d_ -f1,2 <<<“$ jobname”'和'cut -d_ -f3 <<<“$ jobname”'make it – fedorqui

回答

107

默认壳(/bin/sh)Ubuntu下指向dash,不bash

[email protected]:~$ readlink -f $(which sh) 
/bin/dash 

所以,如果你chmod +x your_script_file.sh,然后用./your_script_file.sh运行它,或者如果你有bash your_script_file.sh运行它,它应该工作的罚款。

使用sh your_script_file.sh运行它将不起作用,因为hashbang行将被忽略,脚本将被dash解释,该脚本不支持该字符串替换语法。

+0

他正在使用'/ bin/bash',所以你的答案不适合?!你在哪里阅读他使用'/ bin/sh'或'sh script.sh'? – DanFromGermany

+2

@DanFromGermany,因为这是导致该错误的唯一原因,即他以不考虑hashbang的方式运行脚本,并且某些其他shell(可能是破折号)不支持bash语法。问题并不总是包含所有需要的细节,我们必须加入点......无论如何,请放下我的答案。 –

+0

我不需要downvote。我有同样的错误消息'坏替代',我只是想收集信息,但这个问题没有帮助,因为它的信息太少。 – DanFromGermany

4

尝试使用bash命令明确运行脚本,而不是仅将它作为可执行文件执行。

+3

好的。通过使用'sh脚本'和'bash脚本'来添加一些示例输出以使其更加清晰将会有所帮助...我的建议:) – fedorqui

16

你的脚本语法是有效的bash和好的。

失败的可能原因:

  1. bash是不是真正的bash,但ksh或其他一些壳不理解bash的参数替换。因为你的脚本看起来很好,可以用bash工作。 执行ls -l /bin/bash并检查它是否真的是bash,而不是与其他shell相关联。

  2. 如果您有您的系统上的bash,那么你可能会执行你的脚本错误的方式,如:ksh script.shsh script.sh(和默认的shell不是bash)的。既然你有适当的shebang,如果你有bash ./script.shbash ./script.sh应该没问题。

+6

如果'/ bin/bash'(而不是'/' bin/sh')曾被链接到不同的shell。 – chepner

+0

ksh实际上是bash的大部分语法扩展的起源;它*当然*具有特定的参数扩展语法问题。我不会倾向于建议将它称为一个不太可能的外壳。 –

28

我有同样的问题。请确保您的脚本没有

#!/bin/sh 

位于脚本的顶部。相反,你应该添加

#!/bin/bash 
+4

我用'#!bin/bash'和'sh script.sh',它仍然给了我错误信息。然后'。/ script.sh'工作。 – whyisyoung

+0

如果你的文件丢失了,在顶部添加'#!/ bin/bash'将会修复* Bad替换*。 – Jamie

+1

@whyisyoung你的变量可能在其名称中有一个点(。)。它给坏了。错误。 – user13107

0

两者 - bash或者破折号 - 的工作,但语法必须是:

FILENAME=/my/complex/path/name.ext 
NEWNAME=${FILENAME%ext}new 
+0

这是一个完全不同的操作。另外,由于OP使用小写变量名称遵循良好实践(请参阅http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap08.html - 大写名称用于对OS有意义的变量或shell;小写名称保留给应用程序使用),它也应该这样做。 –

1

此外,还要确保你没有一个空字符串的第你的脚本的行。

即确保#!/ bin/bash是脚本的第一行。

7

对于其他人来说,在这里到达,还将使用命令的环境变量语法时,例如${which sh}而不是正确$(which sh)