bash:糟糕的换人

#!/bin/bash jobname="job_201312161447_0003" jobname_pre=${jobname:0:16} jobname_post=${jobname:17} 

这个bash脚本在Ubuntu上给我错误的replace错误。 任何帮助将不胜感激。

Ubuntu下的默认shell( /bin/sh )指向dash ,而不是bash

 me@pc:~$ 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运行它sh your_script_file.sh将不起作用,因为hashbang行将被忽略,脚本将被dash解释,不支持该stringreplace语法。

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

 #!/bin/sh 

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

 #!/bin/bash 

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

失败的可能原因:

  1. 你的bash是不是真的bash,但ksh或其他不懂bash的参数replace的shell。 因为你的脚本看起来很好,并与bash合作。 做ls -l /bin/bash并检查它是否真的是bash,而不是与其他shell相关联。

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

对于那些到达这里的人来说,当使用envvariables语法来执行命令时,这个确切的消息也会出现,例如${which sh}而不是正确的$(which sh)

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

另外,请确保脚本的第一行没有空string。

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

bash或破折号 – 工作,但语法需要是:

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