Замена строки в Bash-Script «Неправильная замена»

Замена строки в Bash-Script «Неправильная замена»

Я пробую простую замену строки в скрипте 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.

Связанный контент