String 巴什:糟糕的替代
这个bash脚本在ubuntu上给了我错误的替换错误。非常感谢您提供的任何帮助。请尝试使用bash命令显式运行脚本,而不仅仅是将其作为可执行文件执行。您的脚本语法是有效的bash,并且很好 故障的可能原因:String 巴什:糟糕的替代,string,bash,ubuntu,substitution,String,Bash,Ubuntu,Substitution,这个bash脚本在ubuntu上给了我错误的替换错误。非常感谢您提供的任何帮助。请尝试使用bash命令显式运行脚本,而不仅仅是将其作为可执行文件执行。您的脚本语法是有效的bash,并且很好 故障的可能原因: 您的bash并不是真正的bash,而是ksh或其他不理解bash参数替换的shell。因为您的脚本看起来很好,可以与bash一起使用。 执行ls-l/bin/bash并检查它是否真的是bash,而不是与其他shell链接的sym 如果您的系统上确实有bash,那么您可能以错误的方式执行脚本,
bash
并不是真正的bash,而是ksh
或其他不理解bash参数替换的shell。因为您的脚本看起来很好,可以与bash一起使用。
执行ls-l/bin/bash
并检查它是否真的是bash,而不是与其他shell链接的symksh script.sh
或sh script.sh
(默认shell不是bash)。既然您有合适的shebang,那么如果您有bash/script.sh
或bash./script.sh
就可以了/bin/sh
)指向dash
,而不是bash
#!/bin/bash
jobname="job_201312161447_0003"
jobname_pre=${jobname:0:16}
jobname_post=${jobname:17}
因此,如果您使用chmod+x您的_script_file.sh
,然后使用/your_script_file.sh
运行它,或者如果您使用bash您的_script_file.sh运行它,它应该可以正常工作
使用sh您的脚本文件运行它。sh
将不起作用,因为hashbang行将被忽略,脚本将由破折号解释,破折号不支持字符串替换语法。我也有同样的问题。确保你的脚本没有
me@pc:~$ readlink -f $(which sh)
/bin/dash
在脚本的顶部。相反,您应该添加
#!/bin/sh
bash或dash都可以,但语法必须是:
#!/bin/bash
另外,确保脚本的第一行没有空字符串。
i、 e.确保#/bin/bash
是脚本的第一行。对于到达此处的其他人,在使用命令的env变量语法时,也会显示此确切消息,例如${which sh}
而不是正确的$(which sh)
我发现这个问题要么是由标记的答案引起的,要么是在bash声明之前有一行或空格看起来像是“+x”导致了问题:
FILENAME=/my/complex/path/name.ext
NEWNAME=${FILENAME%ext}new
与您的示例无关,但是对于Bash无法识别的任何替换语法,您也可以在Bash中获得错误替换
。这可以是:
- 零散的空格。例如,
bash-c'${x}'
- 打字错误。例如,
bash-c'${x;-}'
- 在更高版本的Bash中添加的功能。例如,
bash-c'${x@Q}“
在bash4.4之前
如果在同一个表达式中有多个替换,Bash可能对确定有问题的表达式没有多大帮助。例如:
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
我在bash中用大括号在表达式中添加了两次美元符号:
$ bash -c '"${x } multiline string
$y"'
bash: line 1: ${x } multiline string
$y: bad substitution
而不是
cp -r $PROJECT_NAME ${$PROJECT_NAME}2
在我的例子中(在ubuntu 18.04下),我混合了$(${})
,效果很好:
BACKUPED\u NB=$(ls${HOST\u BACKUP\u DIR}*${CONTAINER\u NAME}.BACKUP.sql.gz|wc--line)
完整示例。对我来说效果很好。你想完成什么?我想把jobname分为两部分:job_20131261447和0003。只有当我试图在ubuntu上运行时,才会出现这个错误。如果您使用cut
<代码>切割-d_u1;f1,2谢谢。但是为什么jobname_pre=${jobname:0:16}给出了error@bludger你是对的,我看到如果你做了sh script.sh
,它会得到一个“坏的替换”错误。好的。通过使用sh脚本
和bash脚本
,添加一些示例输出以使其更加清晰,这将很有帮助。。。我的建议是:)如果/bin/bash
(而不是/bin/sh
)曾经链接到不同的shell,我会感到惊讶。ksh实际上是bash大多数语法扩展的来源;它当然有特定的参数扩展语法。我不会建议把它称为一个不太可能实现的shell。我使用了#!bin/bash
和sh script.sh
,它仍然给我错误消息。然后/script.sh
工作。如果您的文件顶部缺少一个shebang,请添加#/bin/bash
也将修复错误的替换。@为什么您的变量名称中可能有一个点(.)。它给出了错误的subst.错误。@why显示#代码>行仅在直接执行脚本时使用。如果您使用sh script.sh
该行将被完全忽略。他使用的是/bin/bash
,因此您的答案不合适?!你在哪里阅读他使用的代码> /BI/SH 或<代码> SH脚本?SH ?@ DanFromGermany,因为这是错误的唯一原因,即他以不考虑HASBANG的方式运行脚本,而BASH语法不受其他shell(可能是DASH)的支持。问题并不总是包含所有需要的细节,我们必须把这些点连在一起。。。不管怎样,请随意否决我的答案。我不需要否决。我有相同的错误消息错误替换,我只是想收集信息,但这个问题没有帮助,因为它的信息太少。@Danfrom Germany您可以尝试发布您自己的问题,可能不是完全相同的问题。我使用的是zsh
:facepalm:这是一个完全不同的操作。此外,由于OP遵循良好的实践,使用小写变量名(请参阅——大写名称用于对OS或shell有意义的变量;小写名称保留给应用程序使用),同样应该这样做。这是错误替换的第一个成功案例,所以我想我应该包括我们遇到的案例。(这是Bash 4.3中的@Q
隐藏在一个长的多行表达式中。)这是我在mac上运行Bash 3.x时关于@Q
被添加到Bash-4.4
中的问题。你救了我一天。非常感谢你!区别在于大括号{
与普通b
cp -r $PROJECT_NAME ${PROJECT_NAME}2