String 巴什:糟糕的替代

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脚本在ubuntu上给了我错误的替换错误。非常感谢您提供的任何帮助。

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

您的脚本语法是有效的bash,并且很好

故障的可能原因:

  • 您的
    bash
    并不是真正的bash,而是
    ksh
    或其他不理解bash参数替换的shell。因为您的脚本看起来很好,可以与bash一起使用。 执行
    ls-l/bin/bash
    并检查它是否真的是bash,而不是与其他shell链接的sym

  • 如果您的系统上确实有bash,那么您可能以错误的方式执行脚本,如:
    ksh script.sh
    sh script.sh
    (默认shell不是bash)。既然您有合适的shebang,那么如果您有bash
    /script.sh
    bash./script.sh
    就可以了

  • Ubuntu下的默认shell(
    /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