#!/bin/bash
jobname="job_201312161447_0003"
jobname_pre=${jobname:0:16}
jobname_post=${jobname:17}
这个bash脚本在Ubuntu上给了我 Bad substitution 错误。任何帮助将受到高度赞赏。
答案 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。
失败的可能原因:
你的bash
不是真正的bash而是ksh
或其他一些不理解bash参数替换的shell。因为你的脚本看起来很好并且可以使用bash。
做ls -l /bin/bash
并检查它是否真的是bash而不是sym链接到其他shell。
如果您的系统上有bash,那么您可能会以错误的方式执行脚本:ksh script.sh
或sh script.sh
(并且您的默认shell不是bash)。由于你有适当的shebang,如果你有bash ./script.sh
或bash ./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 -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声明前有一行或空格