Я пробую простую замену строки в скрипте bash:
#!/bin/bash
x="I love Linux"
echo "${x/Linux/Unix}"
Он отлично работает на моем Mac, но не работает на моем сервере. Я пробовал разные примеры с разных сайтов, но всегда получаю ошибку:
Bad substitution
Моя версия bash:GNU bash, Version 4.4.12(1)-release (x86_64-pc-linux-gnu)
Что я делаю не так?
решение1
echo "${x/Linux/Unix}"
правильный ли синтаксис в bash, начиная с версии 2.0, выпущенной в 1996 году.
Bash не выдает точное сообщение об ошибке Bad substitution
. Его сообщение, когда он сталкивается с чем-то, что выглядит почти, но не совсем как подстановка параметров, немного отличается:
$ bash -c '${}'
bash: ${}: bad substitution
С другой стороны, dash, реализация которого реализована /bin/sh
во многих системах Linux, выдает именно такое сообщение:
$ dash -c 'echo "${x/Linux/Unix}"'
dash: 1: Bad substitution
Ошибка является достаточным намеком на то, что,как заметил Кусалананда, вы на самом деле не запускаете этот скрипт как программу: вы запускаете какую-то программу, предположительно sh
или /bin/sh
, и говорите ей запустить этот скрипт. Ваш скрипт — это правильная программа bash, но не правильная программа sh, поэтому он не будет работать в системах, где sh — это другой диалект, не имеющий того же набора функций, что и bash.
Ваш скрипт — это отдельная программа.притонстрока в верхней части скрипта сообщает системе, какой интерпретатор использовать. Чтобы запустить скрипт, просто введите его путь или имя файла, если он находится в пути поиска команд ( $PATH
). Как и любая другая исполняемая программа, будь то скрипт (имеет строку shebang) или нет (бинарный файл, который ядро выполняет самостоятельно 1 ), он должен иметь разрешения на выполнение ( chmod +x path/to/script
). Если по какой-то причине у вас есть скрипт, который не является отдельной программой, и вы хотите запустить его с помощью bash, запустите bash path/to/script
, а не sh path/to/script
.
1 Или с помощью других средств передачи информации о том, как должен быть выполнен файл, например, с помощью механизма binfmt_misc в Linux.