bash:糟糕的替代

时间:2013-12-16 16:01:20

标签: string bash ubuntu substitution

#!/bin/bash

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

这个bash脚本在Ubuntu上给了我 Bad substitution 错误。任何帮助将受到高度赞赏。

13 个答案:

答案 0 :(得分:157)

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运行它将无效,因为hashbang行将被忽略,脚本将由dash解释,{{1}}不支持该字符串替换语法。

答案 1 :(得分:49)

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

#!/bin/sh 

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

#!/bin/bash

答案 2 :(得分:18)

您的脚本语法是有效的bash和good。

失败的可能原因:

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

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

答案 3 :(得分:17)

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

答案 4 :(得分:6)

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

答案 5 :(得分:6)

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

  • 离群空格。例如。 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

答案 6 :(得分:1)

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

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

答案 7 :(得分:1)

我在bash中带有花括号的表达式中两次添加了美元符号:

cp -r $PROJECT_NAME ${$PROJECT_NAME}2

代替

cp -r $PROJECT_NAME ${PROJECT_NAME}2

答案 8 :(得分:0)

两者 - bash或dash - 工作,但语法必须是:

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

答案 9 :(得分:0)

看起来像“ + x”会引起问题:

root@raspi1:~# cat > /tmp/btest
#!/bin/bash

jobname="job_201312161447_0003"
jobname_pre=${jobname:0:16}
jobname_post=${jobname:17}
root@raspi1:~# chmod +x /tmp/btest
root@raspi1:~# /tmp/btest
root@raspi1:~# sh -x /tmp/btest
+ jobname=job_201312161447_0003
/tmp/btest: 4: /tmp/btest: Bad substitution

答案 10 :(得分:0)

我同意Ahmed和RavinderSingh13 我有一个类似的问题,发现我的某些脚本第一行的“#!/ bin / bash”之前有一个空格。 我从来不知道这种空间是如何出现的,但是我的所有脚本在每一行的开头都至少有一个空格

答案 11 :(得分:0)

就我而言(在ubuntu 18.04下),我有一个混合的 $($ {})可以正常工作:

BACKUPED_NB=$(ls ${HOST_BACKUP_DIR}*${CONTAINER_NAME}.backup.sql.gz | wc --lines)

https://devops.stackexchange.com/questions/12830/backup-dockerise-mysql-database-from-host-volume上的完整示例

答案 12 :(得分:-1)

我发现此问题是由标记的答案引起的,或者bash声明前有一行或空格