2015-07-17 10 views
12

Próbuję pobrać przyrostek ciągu znaków w Bash, używając składni podła ${string:pos}, ale nie mogę zrozumieć, dlaczego to nie zadziała. I udało się uprościć mój przykładowy kod do tego:Jak wziąć przyrostek ciągu w bash przy użyciu przesunięć ujemnych?

STRING="hello world" 

POS=4 
echo ${STRING:POS} # prints "o world" 
echo ${STRING:4} # prints "o world" 

POS=-4 
echo ${STRING:POS} # prints "orld" 
echo ${STRING:-4} # prints "hello world" 

Pierwsze trzy linie działają dokładnie tak, jak bym się spodziewał, ale dlaczego końcowy druku linia "hello world" zamiast "orld"?

Odpowiedz

17

Ponieważ :- jest składnią rozszerzenia parametrów do "Użyj wartości domyślnych".

Z documentation:

Gdy nie rozwinęła tego podciągu za pomocą sposobu opisanego poniżej (na przykład „: -”), testy atakujących dla parametru, który jest wyłączony lub puste.

Więc wykonując ${STRING:-4} jesteś faktycznie pytaniem bash rozszerzyć STRING a jeśli jest wyłączony (nigdy nie zostały przypisane wcześniej) lub zerowy (a łańcuchem pustym, drukowane jako '') będzie zastąpić ekspansję z 4. W twoim przykładzie ustawiono STRING i tym samym jest on rozszerzany do swojej wartości.

jak inny państw odpowiedź, trzeba scape ekspresji do nie spuście Zachowanie wartości domyślnej, instrukcja określa go:

Uwaga że negatywna przesunięcie musi być oddzielony od okrężnicy przez co najmniej jedno miejsce, aby uniknąć pomyłki z: - ekspansją.

Na przykład:

${STRING:(-4)} 
${STRING: -4} 
+2

Dobrze , to uroczo niejednoznaczne. – qntm

8

Trzeba „uciec” parametry zaczynając od deski rozdzielczej z nawiasu lub przestrzeni, inaczej bash będzie traktować go jako zwykłego łańcucha:

echo ${STRING:(-4)} 
echo ${STRING: -4} 
Powiązane problemy