Když %
se používá ve vzoru ${variable%substring}
vrátí obsah variable
s nejkratším výskytem substring
odstraněn ze zadní strany variable
.
Tato funkce podporuje vzory zástupných znaků – proto přijímá hvězdičku (hvězdičku) jako náhradu za nula nebo více znaků.
Je třeba zmínit, že toto je specifické pro Bash - ostatní linuxové shelly tuto funkci nutně neobsahují.
Pokud se chcete dozvědět více o manipulaci s řetězci v Bash, velmi doporučuji přečíst si tuto stránku. Kromě dalších užitečných funkcí - například - vysvětluje, co dělá %%
udělat :)
Edit:Zapomněl jsem to zmínit, když je použit ve vzoru $((variable%number))
nebo $((variable1%$variable2))
%
znak bude fungovat jako modulo operátor. DavidPostill má ve své odpovědi konkrétnější odkazy na dokumentaci.
Když %
se používá v jiném kontextu, měl by být rozpoznán pouze jako běžný znak.
Bash Reference Manual:Shell Parameter Expansion
${parameter%word}
${parameter%%word}
slovo je rozbalen tak, aby vytvořil vzor stejně jako u rozbalení souboru. Pokud se vzor shoduje se zadní částí rozšířené hodnoty parametru , pak výsledkem expanze je hodnota parametru s nejkratším odpovídajícím vzorem (
‘%’
case) nebo nejdelší odpovídající vzor (‘%%’
případ) smazán. Pokud parametr je‘@’
nebo‘*’,
operace odstranění vzoru se postupně aplikuje na každý poziční parametr a rozšíření je výsledný seznam. Pokud parametr je proměnná pole s indexem‘@’
nebo‘*’,
operace odstranění vzoru se postupně aplikuje na každý člen pole a rozšíření je výsledným seznamem.
Experimentováním jsem zjistil, že shoda za % je zahozena, když je řetězec uzavřen ve složených závorkách (složených závorkách).
Pro ilustraci:
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
Zde je výstup:
abcd
abcd%
abcd
abcd
ab
abcd
ab
abcd
abcd%c*