Рейтинг:0

У меня проблемы с кавычками в моем скрипте bash

флаг au

как сделать так чтобы в этом скрипте что-то искал из базы. он искал его и изменил его имя в терминале. У меня проблема с кавычками здесь. Может кто знает как исправить?

spr-уставен ()
{
echo -e "\e[31;43mSprawdzanie UstawieÅ\e[0m \e[101mIP $1\e[0m"
межтрубный = 0
в то время как [ $intertube -ne 1 ]; делать
пинг $1 -c 5
если [$? -экв 0]; тогда
sshpass -p (проход) ssh -t (пользователь)@$1 "
sudo sqlite3 config.sqlite "SELECT * FROM settings" |grep "SALE_POINT" | awk '{sub(/SALE_POINT/,"\033[1mPunkt Sprzedaży:\033[0m")}1' &&
выход "
echo -e "\e[1;5;32mSprawdzony\e[0m"
межтрубный=1;
еще
echo -e "\e[1;5;31m!!! ШУТКА OFFLINE !!!\e[0m"
сломать
фи
сделано
}
Tom Yan avatar
флаг in
`"Punkt Sprzedaży"` должно быть `\"Punkt Sprzedaży\"`?
Black4Killer avatar
флаг au
Все еще не работает. awk: строка 1: синтаксическая ошибка в или около [ Ошибка: неполный ввод
djdomi avatar
флаг za
@Black4Killer, обновите вопрос, пожалуйста, с текущим состоянием кода `sub(/SALE_POINT/,"\033[1mPunkt`, если я понимаю дело `sub(/SALE_POINT/,\"\033[1mPunkt`, если вы этого не сделаете' Если вы не хотите переводить специальный символ, он должен начинаться с \CHAR, где char — это специальный символ, вы также можете отладить его при запуске той же команды с помощью `echo`, чтобы он точно показал вам, что он делает, что означает `echo sudo sqlite3 config .sqlite "SELECT * FROM settings" |grep "SALE_POINT" | awk '{sub(/SALE_POINT/\,"\033[1mPunkt Sprzedaży:\033[0m\")}1' && выход "`
Black4Killer avatar
флаг au
@djdomi они показали мне: ```bash: /home/black/.bash_aliases: строка 28: синтаксическая ошибка рядом с неожиданным токеном`)' ```
Рейтинг:3
флаг ph

Мне кажется, что основная проблема заключается в том, что кавычки не вложены так, как вы их используете в ssh команда. То есть в этой команде:

sshpass -p (проход) ssh -t (пользователь)@$1 "
sudo sqlite3 config.sqlite "SELECT * FROM settings" |grep "SALE_POINT" | awk '{sub(/SALE_POINT/,"\033[1mPunkt Sprzedaży:\033[0m")}1' &&
выход "

" в "ВЫБЕРИТЕ ИЗ... на самом деле является закрытой кавычкой (соответствующей открытой кавычке в предыдущей строке), поэтому вместо ВЫБЕРИТЕ * ИЗ настроек будучи внутри двух слоев кавычек, он фактически полностью не заключен в кавычки (и, как следствие, * будет расширяться до списка файлов в локальном каталоге, вызывая черт знает какой хаос).

Как сказал djdomi в комментарии, вы можете увидеть, какие аргументы ssh выглядеть после того, как оболочка проанализировала их (и, следовательно, то, что будет отправлено в удаленную систему для выполнения), заменив ssh команда с эхо. Когда я запускаю это:

эхо"
sudo sqlite3 config.sqlite "SELECT * FROM settings" |grep "SALE_POINT" | awk '{sub(/SALE_POINT/,"\033[1mPunkt Sprzedaży:\033[0m")}1' &&
выход "

он печатает:

sudo sqlite3 config.sqlite ВЫБРАТЬ file1.txt file2.jpg ИЗ настроек |grep SALE_POINT | awk '{sub(/SALE_POINT/,033[1mPunkt Sprzedaży:033[0m)}1' &&
выход 

Самое прямое решение — избежать внутренних двойных кавычек, чтобы локальная оболочка передала их оболочке удаленной системы:

sshpass -p (проход) ssh -t (пользователь)@$1 "
sudo sqlite3 config.sqlite \"SELECT * FROM settings\" |grep \"SALE_POINT\" | awk '{sub(/SALE_POINT/,\"\033[1mPunkt Sprzedaży:\033[0m\")}1' &&
выход "

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

... но я бы рекомендовал немного упростить это. я не вижу причин, по которым grep и аук необходимо запускать в удаленной системе, а не в локальной системе (и выход команда не делает ничего полезного, так как она все равно будет завершена). Таким образом, вы могли бы переместить grep и аук команды за пределами ssh команда:

sshpass -p (пароль) ssh -t (пользователь) @$1 "sudo sqlite3 config.sqlite \"SELECT * FROM settings\"" |
    grep "SALE_POINT" |
    awk '{sub(/SALE_POINT/,"\033[1mPunkt Sprzedaży:\033[0m")}1'

И я всегда ненавижу видеть grep использовался раньше аук, когда аук вполне способен делать все сам:

sshpass -p (пароль) ssh -t (пользователь) @$1 "sudo sqlite3 config.sqlite \"SELECT * FROM settings\"" |
    awk '/SALE_POINT/ {sub(/SALE_POINT/,"\033[1mPunkt Sprzedaży:\033[0m"); Распечатать}'

Я бы также рекомендовал двойные кавычки для всех ссылок на переменные (например, пинг "$1" -c 5 вместо того, чтобы просто пинг $1 -c 5), и заменив это:

пинг $1 -c 5
если [$? -экв 0]; тогда

только с:

если пинг "$1" -c 5; тогда

И, наконец, я бы порекомендовал printf вместо эхо -е -- Это более предсказуемо. printf немного сложнее в использовании — первый аргумент представляет собой строку формата, которая сообщает ему, как печатать любые оставшиеся аргументы, и он не добавляет автоматически новую строку в конце (поэтому добавьте ее явно с помощью \n) -- но с меньшей вероятностью сломается из-за некоторых изменений в версии оболочки эхо (как случилось со мной некоторое время назад...). Так что используйте, например.

printf "\e[31;43m%s\e[0m \e[101m%s1\e[0m\n" "Расширение уставаÅ" "IP $1"

О, и я всегда рекомендую запускать ваши скрипты через shellcheck.net -- это укажет на многие распространенные ошибки и плохие практики.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.