Объявление BASH. Массив строк в скрипте

Я пишу небольшой скрипт, чтобы проверить свое понимание регулярного выражения оператора сравнения "=~". Я думал, что мой синтаксис в порядке, но я продолжаю получать:

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"

Это выглядит несколько (хотя и не совсем) похоже на ошибку, которую вы получите, если запустите скрипт с dash вместо bash.

chepner 21.03.2022 21:10

Кстати: Пожалуйста, вставьте свой скрипт в shellcheck.net и попробуйте реализовать рекомендации, сделанные там.

Cyrus 21.03.2022 21:33

Я подозреваю, что вы вызываете скрипт не с помощью ./your_script.sh, а с помощью sh your_script.sh. Таким образом, вы используете sh, а не bash. sh не знает массивов. См.: sh (Борн-шелл) обычно не bash (Оболочка Bourne-again).

Cyrus 21.03.2022 21:36

Дополнительное примечание: вы должны заключать в двойные кавычки ${inputsArr[@]}, а также обычные ссылки на переменные, чтобы оболочка не искажала элементы массива (посредством разделения слов и расширения имени файла с помощью подстановочных знаков). С другой стороны, если $input предполагается рассматривать как регулярное выражение, а не фиксированную строку, вы должны удалить двойные кавычки вокруг него (примечание: это относится к тому, как работает правая часть сравнения [[ =~ ]]) . shellcheck.net хорошо указывает на распространенные ошибки, подобные этим.

Gordon Davisson 21.03.2022 22:37
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
4
53
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Код работает в 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
  • $SHELL должен сообщить вам, что есть у текущего пользователя, но вы можете изменить его на лету, поэтому другая команда более полезна.
  • Оболочка Borne (sh) не так хорошо работает с массивами. Вы должны использовать eval.
  • измените оболочку по умолчанию на bash. Ссылка: https://www.tecmint.com/change-a-users-default-shell-in-linux/

Оболочка Bourne вообще не работает с массивами; вы можете как бы подделать их с помощью eval, но если вы точно не знаете, что делаете, и не очень осторожны, это, как правило, странно глючит. Если вам нужны массивы, гораздо лучше использовать оболочку, которая их поддерживает, например bash, zsh или ksh.

Gordon Davisson 21.03.2022 22:32

Я просто достигаю своей цели с этим!

#!/bin/bash

inputsArr=("ab" "67" "7b7" "g" "67777" "07x7g7" "77777" "7777" "")

for input in ${inputsArr[@]}; do [[ "$input" =~ $1 ]]; echo "$?" ; done 

Я хотел бы поблагодарить всех, кто дал мне несколько советов по этой основной проблеме со сценарием BASH. Без вас я, конечно, не достиг бы своей цели собственным путем, и прекрасно видеть это сотрудничество в действии.

Другие вопросы по теме