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和好的。
失败的可能原因:
-
你的
bash
是不是真的bash,但ksh
或其他不懂bash的参数replace的shell。 因为你的脚本看起来很好,并与bash合作。 做ls -l /bin/bash
并检查它是否真的是bash,而不是与其他shell相关联。 -
如果您的系统上有bash,那么您可能会以错误的方式执行脚本,如:
ksh script.sh
或sh script.sh
(并且您的默认shell不是bash)。 既然你有适当的shebang,如果你有bash./script.sh
或bash ./script.sh
应该没问题。
对于那些到达这里的人来说,当使用envvariables语法来执行命令时,这个确切的消息也会出现,例如${which sh}
而不是正确的$(which sh)
尝试使用bash命令显式运行脚本,而不是仅仅执行它作为可执行文件。
另外,请确保脚本的第一行没有空string。
即确保#!/ bin / bash是脚本的第一行。
bash或破折号 – 工作,但语法需要是:
FILENAME=/my/complex/path/name.ext NEWNAME=${FILENAME%ext}new