Za każdym razem, gdy to sprawdzam, zwykle znajduję odpowiednią sekcję strony podręcznika bash, wyszukując %%lub ##, ponieważ jest to niezapomniane i wystarczająco rzadkie, aby szybko znaleźć odpowiednią sekcję. man bash/##
Peter Cordes
3
@PeterCordes Zawsze pamiętam to przez „To 5%, więc% jest na końcu, a zatem wycina od końca. I to jest # 5, więc # jest na początku i cięcia od początku”. Ale czasem nawet mylę ten…
glglgl
2
@glglgl: Na typowej klawiaturze USA #znajduje się bezpośrednio po lewej stronie $i %bezpośrednio po prawej stronie. Nie potrzeba mnemonika - wystarczy spojrzeć w dół. (To prawdopodobnie przynajmniej część tego, dlaczego te symbole zostały wybrane.)
Kevin J. Chase
@ KevinJ.Chase Nie każdy na świecie ma typową klawiaturę w USA. Rzeczywiście, na niemieckiej klawiaturze% ma również wartość $, co może być początkiem do zapamiętywania.
glglgl
Odpowiedzi:
29
Gdy %zostanie użyty we wzorcu ${variable%substring}, zwróci zawartość variablez najkrótszym wystąpieniem substringusuniętym z tyłu variable.
Ta funkcja obsługuje wzory wieloznaczne - dlatego przyjmuje gwiazdkę (gwiazdkę) jako substytut zerowej lub większej liczby znaków.
Należy wspomnieć, że jest to specyficzne dla Bash - inne powłoki linuksowe niekoniecznie zawierają tę funkcję.
Jeśli chcesz dowiedzieć się więcej na temat manipulacji ciągami w Bash, gorąco polecam przeczytanie tej strony. Wśród innych przydatnych funkcji to - na przykład - wyjaśnia, co robi %%:)
EDIT: Zapomniałem wspomnieć, że gdy jest stosowany w strukturze $((variable%number))lub postać będzie funkcjonować jako operator modulo. DavidPostill ma w swojej odpowiedzi bardziej szczegółowe linki do dokumentacji.$((variable1%$variable2))%
Gdy %jest używany w innym kontekście, powinien być rozpoznawany tylko jako zwykły znak.
Operator obsługuje wzory wieloznaczne , a nie wyrażenia regularne.
ogrodnik
Jak wspomniano o ogrodniku - obsługuje globalne wzory, a nie wyrażenia regularne. W wyrażeniu regularnym gwiazda oznacza zero lub więcej poprzedniego znaku.
Operatory usuwające prefiks i sufiks są standardowe , więc powinny być użyteczne w dowolnej shkompatybilnej powłoce, nie tylko w Bash. (choć być może nie cshi tym podobne).
ilkkachu
1
Innym kontekstem, w którym %jest używany, są specyfikatory formatu dla printf.
Słowo jest interpretowane tworząc wzorzec, tak samo jak przy rozwijaniu nazw plików. Jeśli wzorzec pasuje do końcowej części rozwiniętej wartości parametru , wynikiem rozszerzenia jest wartość parametru z usuniętym najkrótszym pasującym wzorcem ( ‘%’przypadek) lub najdłuższym pasującym wzorcem ( ‘%%’przypadek). Jeśli parametr ma wartość ‘@’lub ‘*’,operacja usuwania wzorca jest stosowana do każdego parametru pozycyjnego po kolei, a rozwinięcie jest listą wynikową. Jeśli parametr jest zmienną tablicową indeksowaną za pomocą ‘@’
lub‘*’, operacja usuwania wzoru jest kolejno stosowana do każdego elementu tablicy, a rozwinięcie jest listą wynikową.
Uwaga: niektóre rozszerzenia parametrów, w tym%, są elementami posiksowymi obsługiwanymi przez wiele powłok.
kojiro
7
Eksperymentując, stwierdzam, że dopasowanie po% jest odrzucane, gdy łańcuch jest ujęty w nawiasy klamrowe (nawiasy klamrowe).
Ilustrować:
touch abcd # Create file abcd
for file in ab*; do
echo $file # echoes the filename
echo $file% # echoes the filename plus "%"
echo ${file%} # echoes the filename
echo "${file%}" # echoes the filename
echo
echo "${file%c*}" # Discard anything after % matching c*
echo "${file%*}" # * is not greedy
echo ${file%c*} # Without quotes works too
echo "${file%c}" # No match after %, no effect
echo $file%c* # Without {} fails
done
Może mam to: to jest dla takich rzeczy .*i %określa, że jest nie chciwy, a %%czyni to chciwym? Więc faktycznie w przykładzie przemianowania nie ma znaczenia, czy do użytku %lub %%jeśli jednak były mv "$file" "${file%.*png.jpg}.jpg"(uwaga *) przy użyciu %% by zmienić nazwy wszystkich plików po prostu .jpg, prawda?
Thomas Weller,
@ThomasWeller Myślę, że to prawda. Ale nie jestem ekspertem od bashów.
DavidPostill
Mówienie „Usuń ... najkrótszą część $Pattern” jest błędne, ponieważ zmienna $Patternnie jest zdefiniowana w przykładzie, tylko tekst „Wzór” jest usuwany $varpodczas wykonywania ${var%Pattern}lub ${var%%Pattern}. Może to tylko literówka, ale to kolejny przykład pomyłki tldp.org. Wiki BashGuide lub Bash Hackers są znacznie lepszymi referencjami imho.
John B
@JohnB Dzięki. Oba linki są oznaczone zakładkami. Poprawiłem tekst w odpowiedzi.
%%
lub##
, ponieważ jest to niezapomniane i wystarczająco rzadkie, aby szybko znaleźć odpowiednią sekcję.man bash
/##
#
znajduje się bezpośrednio po lewej stronie$
i%
bezpośrednio po prawej stronie. Nie potrzeba mnemonika - wystarczy spojrzeć w dół. (To prawdopodobnie przynajmniej część tego, dlaczego te symbole zostały wybrane.)Odpowiedzi:
Gdy
%
zostanie użyty we wzorcu${variable%substring}
, zwróci zawartośćvariable
z najkrótszym wystąpieniemsubstring
usuniętym z tyłuvariable
.Ta funkcja obsługuje wzory wieloznaczne - dlatego przyjmuje gwiazdkę (gwiazdkę) jako substytut zerowej lub większej liczby znaków.
Należy wspomnieć, że jest to specyficzne dla Bash - inne powłoki linuksowe niekoniecznie zawierają tę funkcję.
Jeśli chcesz dowiedzieć się więcej na temat manipulacji ciągami w Bash, gorąco polecam przeczytanie tej strony. Wśród innych przydatnych funkcji to - na przykład - wyjaśnia, co robi
%%
:)EDIT: Zapomniałem wspomnieć, że gdy jest stosowany w strukturze
$((variable%number))
lub postać będzie funkcjonować jako operator modulo. DavidPostill ma w swojej odpowiedzi bardziej szczegółowe linki do dokumentacji.$((variable1%$variable2))
%
Gdy
%
jest używany w innym kontekście, powinien być rozpoznawany tylko jako zwykły znak.źródło
sh
kompatybilnej powłoce, nie tylko w Bash. (choć być może niecsh
i tym podobne).%
jest używany, są specyfikatory formatu dlaprintf
.źródło
Eksperymentując, stwierdzam, że dopasowanie po% jest odrzucane, gdy łańcuch jest ujęty w nawiasy klamrowe (nawiasy klamrowe).
Ilustrować:
Oto wynik:
źródło
bash
Co robi Linux shell ( )%
?W tym konkretnym przypadku,
%
to dopasowywanie wzorca operator (uwaga to może być również modulo operator).Operator dopasowywania wzorców
Zmiana parametru źródła
Operator Modulo
Operatorzy źródła
źródło
.*
i%
określa, że jest nie chciwy, a%%
czyni to chciwym? Więc faktycznie w przykładzie przemianowania nie ma znaczenia, czy do użytku%
lub%%
jeśli jednak byłymv "$file" "${file%.*png.jpg}.jpg"
(uwaga *) przy użyciu %% by zmienić nazwy wszystkich plików po prostu.jpg
, prawda?$Pattern
” jest błędne, ponieważ zmienna$Pattern
nie jest zdefiniowana w przykładzie, tylko tekst „Wzór” jest usuwany$var
podczas wykonywania${var%Pattern}
lub${var%%Pattern}
. Może to tylko literówka, ale to kolejny przykład pomyłki tldp.org. Wiki BashGuide lub Bash Hackers są znacznie lepszymi referencjami imho.