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


#!/bin/bash

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

этот сценарий bash дает мне плохая замена ошибка на Ubuntu.

Я пытаюсь разделить jobname на два: job_201312161447 и 0003. Это дает эту ошибку только тогда, когда я пытаюсь запустить это на Ubuntu.

любая помощь будет высоко ценится.

7 78

7 ответов:

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

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

#!/bin/sh 

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

#!/bin/bash

ваш синтаксис скрипта является допустимым bash и хорошо.

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

  1. код bash Это не Баш, но ksh или какая-то другая оболочка, которая не понимает подстановку параметров bash. Потому что ваш скрипт отлично выглядит и работает с bash. Делай ls -l /bin/bash и проверьте, что это действительно bash, а не sym-связанный с какой-то другой оболочкой.

  2. если у вас есть bash на вашей системе, то вы можете выполнять ваши сценарий неправильный, как:ksh script.sh или sh script.sh (и ваша оболочка по умолчанию не bash). Так как у вас есть правильный shebang, если у вас есть bash ./script.sh или bash ./script.sh должно быть нормально.

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

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

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

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

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

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