Баш: плохая замена

59
#!/bin/bash

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

Этот bash script дает мне ошибку Bad substitution на Ubuntu. Любая помощь будет высоко оценена.

  • 0
    Это работает нормально для меня. Что вы пытаетесь достичь?
  • 0
    Я пытаюсь разделить имя задания на два: job_201312161447 и 0003. Это выдает эту ошибку только тогда, когда я пытаюсь запустить это на Ubuntu.
Показать ещё 5 комментариев
Теги:
string
substitution

7 ответов

107
Лучший ответ

По умолчанию оболочка (/bin/sh) в Ubuntu указывает на 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 будет проигнорирована, а script будет интерпретироваться dash, которая не поддерживает синтаксис подстановки строк.

  • 1
    Он использует /bin/bash поэтому ваш ответ не подходит ?! Где вы читаете, он использует /bin/sh или sh script.sh ?
  • 2
    @DanFromGermany, потому что это единственная причина этой ошибки, то есть он запускает скрипт так, что не учитывает hashbang, и этот синтаксис bash не поддерживается какой-либо другой оболочкой (вероятно, dash). Вопросы не всегда содержат всю необходимую информацию, и мы должны присоединиться к точкам ... в любом случае, не стесняйтесь понижать мой ответ.
Показать ещё 3 комментария
26

У меня была та же проблема. Убедитесь, что ваш script не имеет

#!/bin/sh 

вверху вашего script. Вместо этого вы должны добавить

#!/bin/bash
  • 4
    Я использовал #!bin/bash и sh script.sh , он все равно дал мне сообщение об ошибке. Тогда ./script.sh работает.
  • 0
    Если в вашем файле отсутствует шебанг вверху, добавление #!/bin/bash также исправит неправильную замену .
Показать ещё 2 комментария
16

Синтаксис script действителен bash и хороший.

Возможные причины сбоя:

  • Ваш bash на самом деле не bash, а ksh или некоторая другая оболочка, которая не понимает замену параметра bash. Потому что ваш script выглядит отлично и работает с bash. Сделайте ls -l /bin/bash и проверьте его действительно bash, а не sym-связан с какой-либо другой оболочкой.

  • Если у вас есть bash в вашей системе, вы можете выполнить свой script неправильный способ, например: ksh script.sh или sh script.sh (а ваша оболочка по умолчанию - не bash). Поскольку у вас есть правильный shebang, если у вас bash ./script.sh или bash ./script.sh должно быть хорошо.

  • 7
    Я был бы удивлен, если бы /bin/bash (не /bin/sh ) когда-либо был связан с другой оболочкой.
  • 0
    ksh на самом деле является источником большинства синтаксических расширений bash; он, безусловно, имеет конкретный синтаксис расширения параметров в вопросе. Я бы не стал называть это оболочкой, которая вряд ли будет способна.
7

Для других, которые приходят сюда, это точное сообщение также появится при использовании синтаксиса env для команд, например ${which sh} вместо правильного $(which sh)

4

Попробуйте выполнить script явно с помощью команды bash, а не просто выполнить ее как исполняемый файл.

  • 3
    Неплохо. Было бы полезно добавить пример вывода, чтобы сделать его более понятным, используя sh script и bash script … мое предложение :)
1

Кроме того, убедитесь, что у вас нет пустой строки для первой строки вашего script.

то есть. убедитесь, что #!/bin/ bash является самой первой строкой вашего script.

0

Оба - bash или тире - работают, но синтаксис должен быть:

FILENAME=/my/complex/path/name.ext
NEWNAME=${FILENAME%ext}new
  • 0
    Это совершенно другая операция. Кроме того, поскольку OP следовал передовой практике, используя строчные имена переменных (см. Pubs.opengroup.org/onlinepubs/9699919799/basedefs/… - прописные имена используются для переменных, имеющих значение для ОС или оболочки; строчные имена зарезервировано для использования в приложениях), это необходимо сделать аналогичным образом.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню