Я пишу небольшой скрипт, чтобы проверить свое понимание регулярного выражения оператора сравнения "=~". Я думал, что мой синтаксис в порядке, но я продолжаю получать:
3: Синтаксическая ошибка: "(" неожиданно
это моя небольшая ссылка на скрипт с этой синтаксической ошибкой:
#!/bin/bash
inputsArr=("ab" "67" "7b7" "g" "67777" "07x7g7" "77777" "7777" "")
for input in ${inputsArr[@]}; do
if [[ "$1" =~ "$input" ]]; then
echo "$?"
fi
done
Я пытаюсь сравнить в цикле с массивом некоторые "строки" с моим arg1 или "$1"
Кстати: Пожалуйста, вставьте свой скрипт в shellcheck.net и попробуйте реализовать рекомендации, сделанные там.
Я подозреваю, что вы вызываете скрипт не с помощью ./your_script.sh
, а с помощью sh your_script.sh
. Таким образом, вы используете sh
, а не bash
. sh
не знает массивов. См.: sh
(Борн-шелл) обычно не bash
(Оболочка Bourne-again).
Дополнительное примечание: вы должны заключать в двойные кавычки ${inputsArr[@]}
, а также обычные ссылки на переменные, чтобы оболочка не искажала элементы массива (посредством разделения слов и расширения имени файла с помощью подстановочных знаков). С другой стороны, если $input
предполагается рассматривать как регулярное выражение, а не фиксированную строку, вы должны удалить двойные кавычки вокруг него (примечание: это относится к тому, как работает правая часть сравнения [[ =~ ]]
) . shellcheck.net хорошо указывает на распространенные ошибки, подобные этим.
Код работает в bash, нужно только запустить его в нужной оболочке, можно сделать следующее:
bash ./script.sh g
Также введите ps -p $$
(не echo $SHELL
), чтобы увидеть, в какой оболочке вы сейчас находитесь:
Примеры:
# ps -p $$
PID TTY TIME CMD
25583 pts/0 00:00:00 sh
# exit
# ps -p $$
PID TTY TIME CMD
22538 pts/0 00:00:00 bash
Оболочка Bourne вообще не работает с массивами; вы можете как бы подделать их с помощью eval
, но если вы точно не знаете, что делаете, и не очень осторожны, это, как правило, странно глючит. Если вам нужны массивы, гораздо лучше использовать оболочку, которая их поддерживает, например bash, zsh или ksh.
Я просто достигаю своей цели с этим!
#!/bin/bash
inputsArr=("ab" "67" "7b7" "g" "67777" "07x7g7" "77777" "7777" "")
for input in ${inputsArr[@]}; do [[ "$input" =~ $1 ]]; echo "$?" ; done
Я хотел бы поблагодарить всех, кто дал мне несколько советов по этой основной проблеме со сценарием BASH. Без вас я, конечно, не достиг бы своей цели собственным путем, и прекрасно видеть это сотрудничество в действии.
Это выглядит несколько (хотя и не совсем) похоже на ошибку, которую вы получите, если запустите скрипт с
dash
вместоbash
.