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

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

spr-ustawien()
{
echo -e "\e[31;43mSprawdzanie Ustawień\e[0m \e[101mIP $1\e[0m"
intertube=0
while [ $intertube -ne 1 ]; do
ping $1 -c 5
if [ $? -eq 0 ]; then
sshpass -p (pass) ssh -t (user)@$1 "
sudo sqlite3 config.sqlite "SELECT * FROM settings" |grep "SALE_POINT" | awk '{sub(/SALE_POINT/,"\033[1mPunkt Sprzedaży:\033[0m")}1' &&
exit "
echo -e "\e[1;5;32mSprawdzony\e[0m"
intertube=1;
else
echo -e "\e[1;5;31m!!! JEST OFFLINE !!!\e[0m"
break
fi
done
}
0
задан 21 August 2021 в 08:51
1 ответ

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

sshpass -p (pass) ssh -t (user)@$1 "
sudo sqlite3 config.sqlite "SELECT * FROM settings" |grep "SALE_POINT" | awk '{sub(/SALE_POINT/,"\033[1mPunkt Sprzedaży:\033[0m")}1' &&
exit "

"в "SELECT * FROM...на самом деле является закрытой кавычкой (, совпадающей с открытой кавычкой в ​​предыдущей строке ), поэтому SELECT * FROM settingsне находится внутри двух слоев кавычек. на самом деле полностью (без кавычек, и в результате *будет расширен до списка файлов в локальном каталоге, вызывая кто-знает-какой хаос).

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

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

, он печатает:

sudo sqlite3 config.sqlite SELECT file1.txt file2.jpg FROM settings |grep SALE_POINT | awk '{sub(/SALE_POINT/,033[1mPunkt Sprzedaży:033[0m)}1' &&
exit 

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

sshpass -p (pass) ssh -t (user)@$1 "
sudo sqlite3 config.sqlite \"SELECT * FROM settings\" |grep \"SALE_POINT\" | awk '{sub(/SALE_POINT/,\"\033[1mPunkt Sprzedaży:\033[0m\")}1' &&
exit "

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

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

sshpass -p (pass) ssh -t (user)@$1 "sudo sqlite3 config.sqlite \"SELECT * FROM settings\"" |
    grep "SALE_POINT" |
    awk '{sub(/SALE_POINT/,"\033[1mPunkt Sprzedaży:\033[0m")}1'

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

sshpass -p (pass) ssh -t (user)@$1 "sudo sqlite3 config.sqlite \"SELECT * FROM settings\"" |
    awk '/SALE_POINT/ {sub(/SALE_POINT/,"\033[1mPunkt Sprzedaży:\033[0m"); print}'

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

ping $1 -c 5
if [ $? -eq 0 ]; then

только на:

if ping "$1" -c 5; then

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

printf "\e[31;43m%s\e[0m \e[101m%s1\e[0m\n" "Sprawdzanie Ustawień" "IP $1"

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

3
ответ дан 21 August 2021 в 21:25

Теги

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