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*