问题描述
#!/bin/bash
jobname="job_201312161447_0003"
jobname_pre=${jobname:0:16}
jobname_post=${jobname:17}
这个bash脚本给我在Ubuntu上的”错误替换”错误。任何帮助将不胜感激。
最佳办法
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
运行该脚本将不起作用,因为该哈希行将被忽略,并且脚本将由dash
解释,该脚本不支持该字符串替换语法。
次佳办法
我有同样的问题。确保您的脚本没有
#!/bin/sh
在脚本的顶部。相反,您应该添加
#!/bin/bash
第三种办法
对于到达这里的其他人,当对命令使用env变量语法时也会出现此确切消息,例如${which sh}
而不是正确的$(which sh)
第四种办法
您的脚本语法是有效的bash并且很好。
失败的可能原因:
-
您的
bash
不是真正的bash,而是ksh
或其他不了解bash参数替换的 shell 。因为您的脚本看起来不错,并且可以与bash一起使用。进行ls -l /bin/bash
并检查它确实是bash,而不是sym-linked。 -
如果您的系统上确实有bash,则您可能会以错误的方式执行脚本,例如:
ksh script.sh
或sh script.sh
(并且您的默认shell不是bash)。由于您具有适当的射手,如果您有狂热的话,./script.sh
或bash ./script.sh
应该没问题。
第五种办法
尝试使用bash命令显式运行脚本,而不是仅以可执行文件身份执行。
第六种办法
另外,请确保脚本的第一行没有空字符串。
即确保#!/bin /bash是脚本的第一行。