【问题标题】:bash : Bad Substitutionbash : 错误替换
【发布时间】:2014-01-04 02:20:15
【问题描述】:
#!/bin/bash

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

这个 bash 脚本在 ubuntu 上给了我错误的替换错误。任何帮助将不胜感激。

【问题讨论】:

  • 对我来说工作正常。你想完成什么?
  • 我正在尝试将作业名分为两部分:job_201312161447 和 0003。仅当我尝试在 ubuntu 上运行时才会出现此错误。
  • 嗯,奇怪。如果您使用cut 会怎样? cut -d_ -f1,2 <<< "$jobname"cut -d_ -f3 <<< "$jobname" 成功
  • 谢谢。但为什么 jobname_pre=${jobname:0:16} 给出错误
  • @bludger 你是对的,我知道如果你这样做sh script.sh 它会得到一个“错误替换”错误。

标签: string bash ubuntu substitution


【解决方案1】:

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

【讨论】:

  • 好一个。通过使用sh scriptbash script,添加一些示例输出以使其更清晰会很有帮助...我的建议:)
【解决方案2】:

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

失败的可能原因:

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

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

【讨论】:

  • 如果/bin/bash(不是/bin/sh)曾经链接到不同的shell,我会感到惊讶。
  • ksh 实际上是大多数 bash 语法扩展的起源;它当然具有特定的参数扩展语法。我不会倾向于建议将其称为不太可能的外壳。
【解决方案3】:

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 解释。

【讨论】:

  • 他正在使用/bin/bash,所以你的答案不合适?!你在哪里读到他在使用/bin/shsh script.sh
  • @DanFromGermany 因为这是该错误的唯一原因,即他以不考虑 hashbang 的方式运行脚本,并且其他一些 shell 不支持 bash 语法(可能是破折号) .问题并不总是包含所有需要的详细信息,我们必须加入点...无论如何,请随意对我的答案投反对票。
  • 我不需要投票。我有同样的错误消息bad substitution,我只是想收集信息,但这个问题没有帮助,因为它的信息太少。
  • @DanFromGermany 你可以尝试发布你自己的问题,也许不是完全相同的问题。
  • 我使用的是zsh :facepalm:
【解决方案4】:

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

#!/bin/sh 

在脚本的顶部。相反,您应该添加

#!/bin/bash

【讨论】:

  • 我使用了#!bin/bashsh script.sh,它仍然给了我错误信息。然后./script.sh 工作。
  • 如果您的文件在顶部缺少 shebang,添加 #!/bin/bash 也将修复 错误替换
  • @whyisyoung 您的变量名称中可能有一个点 (.)。它给出了不好的替代品。错误。
  • @whyisyoung #! 行仅在您直接执行脚本时使用。如果您使用sh script.sh,则该行将被完全忽略。
【解决方案5】:

两者 - bash 或 dash - 都可以,但语法必须是:

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

【讨论】:

  • 那是完全不同的操作。此外,由于 OP 通过使用小写变量名称来遵循良好做法(请参阅pubs.opengroup.org/onlinepubs/9699919799/basedefs/…——大写名称用于对 OS 或 shell 有意义的变量;小写名称保留给应用程序使用),它应该这样做同样。
【解决方案6】:

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

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

【讨论】:

    【解决方案7】:

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

    【讨论】:

    • 区别在于花括号 { 和普通括号 ((我花了一点时间才弄清楚你在显示什么)
    【解决方案8】:

    我发现这个问题要么是由标记的答案引起的,要么是在 bash 声明之前有一行或空格

    【讨论】:

      【解决方案9】:

      看起来像“+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】:

        与您的示例无关,但是对于 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
        

        【讨论】:

        • 这是Bad substitution 的第一次点击,所以我想我会包括我们遇到的案例。 (在 Bash 4.3 中,@Q 隐藏在一个长的多行表达式中。)
        • 这是我在 mac 上运行 Bash 3.x 时遇到的问题
        • Prooflink 关于@Q 被添加到bash-4.4
        【解决方案11】:

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

        cp -r $PROJECT_NAME ${$PROJECT_NAME}2
        

        而不是

        cp -r $PROJECT_NAME ${PROJECT_NAME}2
        

        【讨论】:

          【解决方案12】:

          在我的情况下(在 ubuntu 18.04 下),我混合了 $( ${} ) 工作正常:

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

          完整示例here

          【讨论】:

            【解决方案13】:

            我使用了#!bin/bash 并尝试了所有方法,例如在#!bin/bash. 之前或之后没有行
            然后也尝试使用 +x 但仍然没有用。 最后我尝试运行脚本./script.sh 它运行良好。

            #!/bin/bash
            jobname="job_201312161447_0003"
            jobname_post=${jobname:17}
            

            root@ip-10-2-250-36:/home/bitnami/python-module/workflow_scripts# sh jaru.sh
            jaru.sh: 3: jaru.sh: 替换错误

            root@ip-10-2-250-36:/home/bitnami/python-module/workflow_scripts# ./jaru.sh
            root@ip-10-2-250-36:/home/bitnami/python-module/workflow_scripts#

            【讨论】:

              猜你喜欢
              • 2012-02-19
              • 1970-01-01
              • 1970-01-01
              • 2014-09-07
              • 2015-07-03
              • 1970-01-01
              相关资源
              最近更新 更多