Почему расширение параметра не работает? [dубликат]

#!/bin/bash

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

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

71
задан 31 May 2016 в 01:09

6 ответов

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

FILENAME=/my/complex/path/name.ext
NEWNAME=${FILENAME%ext}new
0
ответ дан 15 August 2018 в 16:10
  • 1
    Это совсем другая операция. Кроме того, поскольку ОП следовал хорошей практике, используя имена переменных нижнего регистра (см. [D0] pubs.opengroup.org/onlinepubs/9699919799/basedefs/… - имена верхнего регистра используются для переменных со значением OS или shell, имена нижних регистров зарезервированы для использования приложения), это тоже нужно делать. – Charles Duffy 29 April 2017 в 02:14

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

9
ответ дан 15 August 2018 в 16:10

Синтаксис скрипта действителен: bash и good.

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

Ваш bash не действительно bash, но ksh или некоторая другая оболочка, которая не работает Не понимайте подстановку параметров bash. Потому что ваш сценарий выглядит отлично и работает с bash. Сделайте ls -l /bin/bash и проверьте, действительно ли это bash, а не sym-привязано к какой-либо другой оболочке. Если у вас есть bash на вашей системе, вы можете выполнить свой скрипт не так: ksh script.sh или sh script.sh (и ваша оболочка по умолчанию не bash). Поскольку у вас есть правильный shebang, если у вас есть bash ./script.sh или bash ./script.sh, все должно быть хорошо.
17
ответ дан 15 August 2018 в 16:10
  • 1
    Я был бы удивлен, если бы /bin/bash (не /bin/sh) были связаны с другой оболочкой. – chepner 16 December 2013 в 23:46
  • 2
    ksh на самом деле где большинство расширений синтаксиса bash возникло из; он , конечно, имеет конкретный синтаксис расширения параметра. Я бы не стал предлагать называть его оболочкой, вряд ли способной. – Charles Duffy 29 April 2017 в 02:13

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

4
ответ дан 15 August 2018 в 16:10
  • 1
    Неплохо. Было бы полезно добавить некоторый образец вывода, чтобы сделать его более понятным, используя sh script и bash script ... мое предложение :) – fedorqui 16 December 2013 в 22:23

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

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

1
ответ дан 15 August 2018 в 16:10

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

#!/bin/sh 

в верхней части вашего скрипта. Вместо этого вы должны добавить

#!/bin/bash
33
ответ дан 15 August 2018 в 16:10
  • 1
    Я использовал #!bin/bash и sh script.sh, он все еще дал мне сообщение об ошибке. Затем работает ./script.sh. – whyisyoung 9 April 2015 в 05:13
  • 2
    Если ваш файл отсутствует, shebang наверху добавляет #!/bin/bash также исправляет Плохую замену . – Jamie 20 August 2016 в 12:56
  • 3
    @whyisyoung ваша переменная может иметь точку (.) в ее имени. Это дает плохую субстанцию. ошибка. – user13107 7 September 2016 в 04:13

Другие вопросы по тегам:

Похожие вопросы: