2010-08-08 6 views
5

w bash, można użyć następującego kodu:rozpakować ciąg w zmiennej

[ "$sshcmd" = "" ] && sshcmd="ssh -someopts myhost" 

$sshcmd "echo hello world" 

W zsh, ten sam kod nie działa, ponieważ stara się znaleźć „ssh -someopts myhost” wykonywalny. Jak mogę zrobić to samo w ZSH?

Dzięki Albert

+0

Patrz [BashFAQ/050] (http://mywiki.wooledge.org/BashFAQ/050). –

+0

@Dennis: Jestem drugim przypadkiem, ale w moim przypadku użytkownik przekazuje komendę za pośrednictwem parametru lub zmiennej env do skryptu. A jeśli nie, skrypt używa pewnych wartości domyślnych. Jak rozwiązać ten problem? – Albert

+0

Prawdopodobnie będziesz musiał użyć sugestii w odpowiedzi (i komentarzu) poniżej (które są zgodne z informacjami pod tym linkiem). Należy jednak pamiętać, że istnieje potencjalny wpływ na bezpieczeństwo wykonywania poleceń przekazywanych jako argumenty. –

Odpowiedz

2

Aby podzielić łańcuch na spacji (bardziej ogólnie, na $IFS), tak jak inne powłoki: $=sshcmd

Ale należy zamiast zrobić sshcmd tablicę, tak aby komendy nadal działa, jeśli jeden z opcji zawiera białe spacje:

sshcmd=(ssh -someopts myopts) 
$sshcmd[@] "echo hello world" 

Dotyczy to również basha i ksh, przy okazji; ale musi również chronić podstawienie zmiennych Tablica przed dalszą rozbudowę łupania i pliku:

sshcmd=(ssh -someopts myopts) 
"${sshcmd[@]}" "echo hello world" 
+0

Otrzymuję to przez środowisko z Bash, więc myślę, że tablica nie jest opcją (lub jak mogę ją automatycznie przekonwertować?). Ale '$ = sshcmd' działa, dziękuję! – Albert

+1

@Albert Aby podzielić coś tak, jak robi to shell, użyj '$ {(z) sshcmd}'. Poradzi sobie z przypadkiem, gdy sshcmd zawiera cytowane parametry: jeśli sshcmd zawiera ciąg 'a 'bc d'', to '$ = sshcmd' podzieli go na' a', '' b',' c', 'd'' , podczas gdy '$ {(z) sshcmd}' na 'a',' 'bc d''. Zajmuje się również '$ (...)', '" ... "' itp; patrz sekcja ROZSZERZENIE PARAMETRÓW w man zshexpn. – ZyX

+0

Dzięki @ZyX, wydaje się znacznie bardziej przydatne! – Albert