проблемы с символом $ при чтении позиционных параметров в сценарии оболочки unix

Вы используете MySQL Workbench, но судя по выходным данным при подключении к порту базы данных с помощью браузера, база данных на самом деле является MariaDB , которая является конкурирующей вилкой MySQL.

Поскольку MySQL Workbench разрабатывается совместно с MySQL, разработчики, очевидно, не могут гарантировать полную совместимость с продуктами конкурентов.

(Однако на практике любая функция MySQL Workbench, основанная на базовых функциях базы данных MySQL, разработанной до форка, вероятно, будет работать нормально. С новыми функциями, появившимися после разветвления MariaDB, вам, возможно, придется быть более осторожным.)

Порт 3306 является портом по умолчанию для MySQL/MariaDB и предназначен для прямого соединения между приложениями и базой данных. :он не обеспечивает доступ по протоколу HTTP. Вот почему ваша попытка подключения с помощью браузера привела к появлению строки двоичного мусора с некоторыми фрагментами текста, смешанного в :, он не предназначен для подключения к браузеру.

2
30.06.2021, 15:37
1 ответ

Причина в том, что вы неправильно цитируете свой ввод . Параметр, который вы передаете скрипту, содержит $, а параметр вы передаете без кавычек (, т.е. просто как NS3#$xX$56M), что означает, что он будет подвергаться раскрытию переменной . Это означает, что оболочка, интерпретирующая ваш

sh test.sh e NS3#$xX$56M
Команда

для вызова сценария test.shсначала попытается заменить часть $xXсодержимым переменной оболочки (, либо определенной локально, либо экспортированной как переменная среды )xX, и -, поскольку, вероятно, isn't any -заменяет эту часть словом «ничего» перед тем, как передать результат вашему сценарию. Однако это правильное функционирование оболочки, и, следовательно, в вашем скрипте (нет ничего принципиально неправильного, как заметил @roaima ).

Чтобы предотвратить эту проблему, заключите строку в одинарные -кавычки, которые отключат любые расширения:

sh test.sh e 'NS3#$xX$56M'

В качестве общего примечания к вашему сценарию:

  • Не используйте все -имена переменных в верхнем регистре, если вы не планируете экспортировать их в среду (т.е. используйте testвместоTEST)-это предотвратит нежелательные конфликты между переменными вашего скрипта и, возможно, важными переменными среды.
  • Используйте shellcheck, также доступную как отдельная программа во многих дистрибутивах Linux, для "проверки -чтения" ваших скриптов; это поможет предотвратить многие ошибки.
  • Как видно из проблемы, с которой вы столкнулись,всегда убедитесь, что переменные оболочки правильно заключаются в кавычкипри их использовании,если вы точно не знаете, что хотите, чтобы произошло расширение переменной/глоба и разделение слов. Это также относится к использованию переменных оболочки в вашем скрипте.
  • Вы вызываете скрипт как
    sh test.sh....
    
    Это переопределит строку#!-и будет использовать оболочку sh, которая во многих системах будет совместимой с POSIX -оболочкой, которая не понимает оператор [[... ]], например. Либо сделайте его исполняемым и назовите его как ./test.sh, либо явно используйте bash test.sh.
11
28.07.2021, 11:21

Теги

Похожие вопросы