bash:糟糕的替代

Ari*_*ury 116 string bash ubuntu substitution

#!/bin/bash

jobname="job_201312161447_0003"
jobname_pre=${jobname:0:16}
jobname_post=${jobname:17}
Run Code Online (Sandbox Code Playgroud)

这个bash脚本在Ubuntu上给了我错误的替换错误.任何帮助将受到高度赞赏.

Van*_*aro 169

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

me@pc:~$ readlink -f $(which sh)
/bin/dash
Run Code Online (Sandbox Code Playgroud)

因此,如果你chmod +x your_script_file.sh然后运行它./your_script_file.sh,或者如果你运行它bash your_script_file.sh,它应该工作正常.

运行它将sh your_script_file.sh无法工作,因为将忽略hashbang行并且脚本将被解释dash,这不支持该字符串替换语法.

  • 他正在使用`/ bin / bash`,所以您的答案不合适吗?您在哪里可以看到他在使用`/ bin / sh`或`sh script.sh`? (2认同)
  • @DanFromGermany因为这是导致该错误的唯一原因,即他以不考虑hashbang的方式运行脚本,并且某些其他shell(可能是破折号)不支持bash语法.问题并不总是包含所有需要的细节,我们必须加入点......无论如何我都可以随心所欲地回答我的问题. (2认同)
  • 我不需要downvote。我有相同的错误消息“替换不正确”,我只是试图收集信息,但是这个问题无济于事,因为它的信息太少了。 (2认同)
  • @DanFromGermany您可以尝试发布自己的问题,也许这不是完全相同的问题. (2认同)
  • 谢谢你!我也刚刚被这个咬了。正是我们所需要的:另一个具有微妙特点的 shell 程序,使其适合 5.25 英寸磁盘。 (2认同)

小智 57

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

#!/bin/sh 
Run Code Online (Sandbox Code Playgroud)

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

#!/bin/bash
Run Code Online (Sandbox Code Playgroud)

  • 我使用了`#!bin/bash`和`sh script.sh`,它仍然给了我错误信息.然后`./ script.sh`有效. (4认同)
  • @whyisyoung只有直接执行脚本时才会使用`#!`行.如果使用`sh script.sh`,则完全忽略该行. (4认同)

Nac*_*oma 23

对于到达此处的其他人,当使用命令的env变量语法时,也会出现此确切消息,例如,${which sh}而不是正确的$(which sh)

  • 区别在于大括号“{”与普通括号“(”(我花了一点时间才弄清楚你在显示什么) (13认同)

P.P*_*.P. 20

你的脚本语法是有效的bash和good.

失败的可能原因:

  1. bash不是真正的bash,ksh或者是其他一些不理解bash参数替换的shell.因为你的脚本看起来很好并且可以使用bash.做ls -l /bin/bash并检查它真的是bash而不是sym链接到其他shell.

  2. 如果你的系统上有bash,那么你可能会以错误的方式执行你的脚本:ksh script.sh或者sh script.sh(你的默认shell不是bash).因为你有适当的shebang,如果你有bash ./script.shbash ./script.sh应该没事.

  • 如果`/ bin/bash`(不是`/ bin/sh`)曾经链接到不同的shell,我会感到惊讶. (7认同)

Pal*_*Dot 7

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

  • 好的.通过使用`sh script`和`bash script`来添加一些示例输出以使其更清晰将是有帮助的...我的建议:) (3认同)

wiz*_*urd 7

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

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


Dan*_*bos 6

与您的示例无关,但是Bad substitution对于 Bash 无法识别的任何替换语法,您也可以在 Bash 中获得错误。这可能是:

  • 杂散的空白。例如bash -c '${x }'
  • 一个错字。例如bash -c '${x;-}'
  • 在更高版本的 Bash 中添加的功能。例如bash -c '${x@Q}'在 Bash 4.4 之前。

如果您在同一个表达式中有多个替换,Bash 可能无法帮助确定有问题的表达式。例如:

$ bash -c '"${x } multiline string
$y"'
bash: line 1: ${x } multiline string
$y: bad substitution
Run Code Online (Sandbox Code Playgroud)

  • 这是“错误替换”的第一次点击,所以我想我应该包括我们遇到的情况。(Bash 4.3 中的“@Q”隐藏在一个长的多行表达式中。) (3认同)
  • 这是我在 mac 上运行 Bash 3.x 时遇到的问题 (3认同)
  • [校对链接](https://github.com/bminor/bash/blob/bash-4.4-alpha/CHANGES#L425-L426)关于在`bash-4.4`中添加`@Q`。 (2认同)