LINUX.ORG.RU

bash - конструкция вида ${x%-y}

 


1

2

Всем доброго дня, изучаю чужой скрипт на баше (заодно и сам баш таким путем) в скрипте есть строки такого вида:

tail -n 1 -f /var/log/syslog | while read string

do

echo $string | grep «FWALL.*REJECT» > /dev/null || continue

export $string 2>/dev/null

CHAIN=${CHAIN%-REJECT}

Вот подскажите мне пожалуй - в упор не пойму последнюю строчку

CHAIN=${CHAIN%-REJECT}

запускал скрипт прописав в начале set -x и set -v CHAIN=${CHAIN%-REJECT} - выцепляет ту последовательность символов что идет перед словом REJECT в строчке которая сверху грепается но что значит эта конструкция ${CHAIN%-REJECT}? что значат символы %- ? И откуда баш узнает что операция ${CHAIN%-REJECT} проводится над переменной $string?



Последнее исправление: barmaley99 (всего исправлений: 1)

       ${parameter%word}
       ${parameter%%word}
              Remove matching suffix pattern.  The word is expanded to produce a pattern just as in pathname ex‐
              pansion, and matched against the expanded value of parameter using the rules described under  Pat‐
              tern  Matching  below.  If the pattern matches a trailing portion of the expanded value of parame‐
              ter, then the result of the expansion is the expanded value of parameter with the shortest  match‐
              ing pattern (the ``%'' case) or the longest matching pattern (the ``%%'' case) deleted.  If param‐
              eter 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.
ubik
()

У переменной CHAIN откусывает суффикс -REJECT (если такого суффикса нет, то ничего не откусывает).

Legioner ★★★★★
()
Ответ на: комментарий от Legioner

Только вот странно - там в скрипте до этого места, т.е.

CHAIN=${CHAIN%-REJECT}

Переменная CHAIN нигде не обьявляется, ей ничего не присваивается, и вообще она там нигде не создается и появляется в этом месте в первый раз, попробовал в консоли выполнить эти команды поочереди, т.е.

$string = «xxxxxxxxFWALLxxxREJECTxxx»

(т.е. не иксы а реальная строка из сислога)

echo $string | grep «FWALL.*REJECT» > /dev/null

export $string 2>/dev/null

CHAIN=${CHAIN%-REJECT}

echo $CHAIN

да работает, но как это? Переменная обьявляется сама себя из самой себя?

barmaley99
() автор топика
Последнее исправление: barmaley99 (всего исправлений: 3)
Ответ на: комментарий от barmaley99

CHAIN=${CHAIN%-REJECT}

А заместо CHAIN не пробовал что-нибудь вводить? Например произвольное, но до этого не определённое?

anonymous
()
Ответ на: комментарий от anonymous

Кажется я понял - там в той строке string из сислога - идут последовательности вроде

AAA=XXXXXX1 BBB=XXXXXXXX2 CCC=XXXXX3

и т.д. есть там и CHAIN=XXXXXXXX, после команды

export $string

любая из этих AAA,BBB,CCC становится отдельной переменной и к ним можно смело обращатся echo $AAA выдает XXXXXX1

интересно, еще не знал о такой особенности баша

barmaley99
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.