Escapowanie cudzysłowa i apostrofa w zagnieżdzonych stringach

0

Witam,

Chce wykonać takie polecenie, które po połączenie się przez ssh zapisze odpowiedni string do pliku

sshpass -p user ssh user@IPadress "echo word1 "aaa" "id:1235,str: 'Works' ">> /path/to/file; bash -i"

i chcę osiągnąć następujący rezultat zapisania do pliku

word1 "aaa" "id:1235,str: 'Works'"

Na razie do czego doszedłem jeśli chodzi o escapowanie " i ' to

sshpass -p user ssh user@IPadress "echo word1 '"'"aaa"'"' '"'"id:1235,str: 'Works' "'"'>> /path/to/file; bash -i"

poprawnie wyświetla cudzysłów jednak apostrof już nie

word1 "aaa" "id:1235,str: Works"

Poproszę o podpowiedzi jak w tym przypadku do pliku zapisywać i znaki " i '

1

Być może nie jest to rozwiązanie zadowalające Cię, ale ja postawiłbym pytanie, czy warto używać Basha do wypisywania znaków ' oraz ". Akurat tutaj jest moim zdaniem duża możliwość pomyłki. A prawdopodobnie wiesz, że błędy w Bashu nie zawsze są raportowane w sposób intuicyjny dla użytkownika; a czasem coś, co dla Ciebie jest błędem, w Bashu nie będzie (i wynik może być nieoczekiwany).

3

Poza cytowaniem przy pomocy " oraz ' jest w Bash-u 3 sposób -cytowanie $'' (dolar-apostrof-apostrof) , czyli w stylu C: https://wiki.bash-hackers.org/syntax/quoting#ansi_c_like_strings

$ echo $'Hello\tworld'
Hello	world

W typ przypadku jedyne co musimy escapować to znaki ' oraz \:

$ echo $'word1 "aaa" "id:1235,str: \'Works\'"'
word1 "aaa" "id:1235,str: 'Works'"

Można by też jawnie escapować ", da to ten sam efekt:

$ echo $'word1 \"aaa\" \"id:1235,str: \'Works\'\"'
word1 "aaa" "id:1235,str: 'Works'"
0

@Spearhead: Ciekawy sposób, wykonałem

sshpass -p user ssh user@IPadress "echo $' word1 "aaa" "id:1235,str: \'Works\' " '>> /path/to/file; bash -i"

Jednak zapis do pliku bez znaków " i '

0

Zwykły backslash powinien dać radę.

sshpass -p user ssh user@IPadress "echo word1 \"aaa\" \"id:1235,str: 'Works' \">> /path/to/file; bash -I"
0
mariusz198787 napisał(a):

@Spearhead: Ciekawy sposób, wykonałem

sshpass -p user ssh user@IPadress "echo $' word1 "aaa" "id:1235,str: \'Works\' " '>> /path/to/file; bash -i"

Jednak zapis do pliku bez znaków " i '

No bo to cytowanie $'...' znowu wrzuciłeś w kolejny zwykły ". Chyba musisz zacytować ten zapis jeszcze raz

$ echo $'echo $\' word1 "aaa" "id:1235,str: \\\'Works\\\' " \'>> /path/to/file; bash -i'
echo $' word1 "aaa" "id:1235,str: \'Works\' " '>> /path/to/file; bash -i

Więc wychodzi

shpass -p user ssh user@IPadress $'echo $\' word1 "aaa" "id:1235,str: \\\'Works\\\' " \'>> /path/to/file; bash -i'
0

To jeszcze jedno pytanie: gdybym chciał zamian "aaa" przesłać "aaa&bbb" to jakieś dodatkowe ecape'owanie jest potrzebne? Czy powyższa odpowiedź shpass -p user ssh user@IPadress $'echo $\' word1 "aaa&bbb$$ccc" "id:1235,str: \\\'Works\\\' " \'>> /path/to/file; bash -i' bez problemu się wykona?

1 użytkowników online, w tym zalogowanych: 0, gości: 1