Puncte:0

Am probleme cu qoutes din scriptul meu bash

drapel au

cum să faci asta în acest script care caută ceva din baza de date. l-a căutat și i-a schimbat numele în terminal. Am o problemă cu citatele de aici. Poate stie cineva cum sa o repare?

spr-ustawien()
{
echo -e „\e[31;43mSprawdzanie UstawieÅ\e[0m \e[101mIP $1\e[0m”
intertub=0
while [ $intertube -ne 1 ]; do
ping $1 -c 5
dacă [ $? -eq 0]; atunci
sshpass -p (trece) ssh -t (utilizator)@$1 "
sudo sqlite3 config.sqlite „SELECT * FROM settings” |grep „SALE_POINT” | awk '{sub(/SALE_POINT/,"\033[1mPunkt Sprzedaży:\033[0m")}1' &&
Ieșire "
echo -e „\e[1;5;32mSprawdzony\e[0m”
intertub=1;
altfel
echo -e „\e[1;5;31m!!! JEST OFFLINE !!!\e[0m”
pauză
fi
Terminat
}
Tom Yan avatar
drapel in
`"Punkt Sprzedaży"` ar trebui să fie `\"Punkt Sprzedaży\"`?
Black4Killer avatar
drapel au
Încă nu funcționează. awk: linia 1: eroare de sintaxă la sau aproape de [ Eroare: intrare incompletă
djdomi avatar
drapel za
@Black4Killer actualizați întrebarea, vă rog, cu starea curentă a codului `sub(/SALE_POINT/,"\033[1mPunkt` ar trebui să fie dacă înțeleg cazul `sub(/SALE_POINT/,\"\033[1mPunkt`dacă înțeleg` nu vreau să traduc un caracter special, atunci trebuie să înceapă cu \CHAR unde char este caracterul special, îl puteți depana și atunci când porniți aceeași comandă cu `echo`, astfel încât să vă arate exact ce face, adică `echo sudo sqlite3 config .sqlite „SELECT * FROM settings” |grep „SALE_POINT” | awk '{sub(/SALE_POINT/\,"\033[1mPunkt Sprzedaży:\033[0m\")}1' && ieșire „`
Black4Killer avatar
drapel au
@djdomi mi-au arătat: ```bash: /home/black/.bash_aliases: line 28: error syntax near token neașteptat `)' ```
Puncte:3
drapel ph

Mi se pare că problema de bază este că ghilimele nu se încadrează în modul în care le folosești în ssh comanda. Adică în această comandă:

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

The " în "SELECTAȚI DIN... este de fapt un citat apropiat (care se potrivește cu citatul deschis de pe linia anterioară), deci mai degrabă decât SELECTARE * DIN setări fiind în interiorul a două straturi de ghilimele, este de fapt complet necotat (și, ca rezultat, * se va extinde la o listă de fișiere din directorul local, provocând cine-știe-ce haos).

După cum a spus djdomi într-un comentariu, puteți vedea care sunt argumentele ssh arată ca după ce shell-ul le-a analizat (și, prin urmare, ce va fi trimis la sistemul de la distanță pentru a fi executat) prin înlocuirea ssh comanda cu ecou. Când rulez asta:

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

se tipărește:

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' &&
Ieșire 

Cea mai directă soluție este să scăpați de ghilimelele interioare, astfel încât shell-ul local le va trece prin shell-ul sistemului de la distanță:

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

Rețineți că trebuie să evadați toate dintre ei, chiar și cei din interiorul citatului simplu awk comandă, deoarece acele ghilimele simple nu înseamnă nimic pentru shell-ul local.

... dar aș recomanda să simplificați puțin acest lucru. Nu văd niciun motiv pentru asta grep și awk trebuie să fie rulat pe sistemul de la distanță, mai degrabă decât pe sistemul local (și Ieșire comanda nu face nimic util, deoarece oricum va ieși). Deci ai putea muta grep și awk comenzi în afara ssh comanda:

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

Și mereu urăsc să văd grep folosit inainte awk, când awk este perfect capabil să facă totul în sine:

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

De asemenea, aș recomanda citarea duble a tuturor referințelor variabile (de ex. ping „$1” -c 5 în loc de doar ping $1 -c 5), și înlocuind aceasta:

ping $1 -c 5
dacă [ $? -eq 0]; atunci

cu doar:

dacă ping „$1” -c 5; atunci

Și în sfârșit aș recomanda printf în loc de ecou -e -- este mult mai previzibil. printf este puțin mai complex de utilizat - primul argument este un șir de format care îi spune cum să imprime orice argument rămas și nu adaugă automat o nouă linie la sfârșit (deci adăugați unul explicit cu \n) -- dar este mai puțin probabil să se rupă din cauza unor modificări în versiunea shell-ului ecou (cum mi s-a întâmplat cu ceva timp în urmă...). Deci folosiți de ex.

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

Ah, și vă recomand întotdeauna să vă executați scripturile shellcheck.net -- va evidenția multe greșeli comune și practici proaste.

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.