Bash: Плохая замена

#!/bin/bash

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

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

Ответ 1

По умолчанию оболочка (/bin/sh) в Ubuntu указывает на dash, а не bash.

[email protected]:~$ 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, которая не поддерживает синтаксис подстановки строк.

Ответ 2

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

#!/bin/sh 

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

#!/bin/bash

Ответ 3

Синтаксис 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 должно быть хорошо.

Ответ 4

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

Ответ 5

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

Ответ 6

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

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

Ответ 7

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

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