В чем разница между% и %% в сценариях оболочки? - PullRequest
0 голосов
/ 22 мая 2018

В сценариях bash, когда t="hello.txt" оба

${t%%.txt} и ${t%.txt} возвращают "hello"

то же самое относится к ${t##*.} и ${t#*.} возвращает "txt".

Есть ли разница между ними?Как они работают?

Ответы [ 2 ]

0 голосов
/ 22 мая 2018

Короче говоря, %% удаляет как можно больше, % как можно меньше.

# t="hello.world.txt"
# echo ${t%.*}
hello.world
# echo ${t%%.*}
hello

Из руководства по bash:

'${PARAMETER%WORD}'
'${PARAMETER%%WORD}'
     The WORD is expanded to produce a pattern just as in filename
     expansion.  If the pattern matches a trailing portion of the
     expanded value of PARAMETER, then the result of the expansion is
     the value of PARAMETER with the shortest matching pattern (the '%'
     case) or the longest matching pattern (the '%%' case) deleted.  If
     PARAMETER is '@' or '*', the pattern removal operation is applied
     to each positional parameter in turn, and the expansion is the
     resultant list.  If PARAMETER is an array variable subscripted with
     '@' or '*', the pattern removal operation is applied to each member
     of the array in turn, and the expansion is the resultant list.
0 голосов
/ 22 мая 2018

${string%substring}
Удаляет самое короткое совпадение $substring со спины $string.

Например:

# Rename all filenames in $PWD with "TXT" suffix to a "txt" suffix.
# For example, "file1.TXT" becomes "file1.txt" . . .

SUFF=TXT
suff=txt

for i in $(ls *.$SUFF)
do
  mv -f $i ${i%.$SUFF}.$suff
  #  Leave unchanged everything *except* the shortest pattern match
  #+ starting from the right-hand-side of the variable $i . . .
done ### This could be condensed into a "one-liner" if desired.

${string%%substring}
Удаляет самое длинное совпадение$substring со спины $string.

stringZ=abcABC123ABCabc
#                    ||     shortest
#        |------------|     longest

echo ${stringZ%b*c}      # abcABC123ABCa
# Strip out shortest match between 'b' and 'c', from back of $stringZ.

echo ${stringZ%%b*c}     # a
# Strip out longest match between 'b' and 'c', from back of $stringZ.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...