запутанное утверждение в сценарии оболочки - PullRequest
2 голосов
/ 21 апреля 2011
while sizes=`sizes $pgid`
do
    set -- $sizes
    sample=$((${@/#/+}))
    let peak="sample > peak ? sample : peak"
    sleep 0.1
done

я смущен из-за следующего утверждения:

sample=$((${@/#/+}))

кто-нибудь может объяснить это?

Ответы [ 4 ]

3 голосов
/ 21 апреля 2011

Часть '${@/#/+}' является расширением регулярного выражения:

${parameter/pattern/string}

Шаблон расширяется, чтобы создать шаблон так же, как в расширении имени файла.Параметр раскрывается, и самое длинное совпадение шаблона с его значением заменяется строкой.Если шаблон начинается с '/', все совпадения шаблона заменяются строкой.Обычно заменяется только первый матч.Если шаблон начинается с '#', он должен совпадать в начале расширенного значения параметра.Если шаблон начинается с '%', он должен совпадать в конце расширенного значения параметра.Если строка пуста, совпадения шаблона удаляются, и / следующий шаблон может быть опущен.Если параметр '@' или '*', операция замещения применяется к каждому позиционному параметру по очереди, и расширение является результирующим списком.Если параметром является переменная массива, подписанная '@' или '*', операция замещения применяется к каждому члену массива по очереди, и расширение является результирующим списком.

Таким образом, похоже, что он заменяет пустую строку в начале каждого значения в списке аргументов '$@' на '+'.Его главное достоинство заключается в том, что он префикс каждого аргумента одним махом;в противном случае он похож на "+$var".


Часть '$(( ... )) является арифметическим выражением.Он выполняет арифметику над выражением в скобках.Таким образом, в контексте он складывает значения в списке аргументов, предполагая, что они все числовые.Учитывая расширение, оно может дать:

set -- 2 3 5 7 11
sample=$((${@/#/+}))
sample1=$((+2 +3 +5 +7 +11))
echo $sample = $sample1

и, следовательно, '28 = 28'.

3 голосов
/ 21 апреля 2011

Давайте возьмем линию изнутри.

${@/#/+}

Это расширение параметра, которое расширяет параметр $@ (который в данном случае будет массивом всех элементов в $sizes), а затем сопоставляет шаблон с каждым элементом, заменяя каждый соответствующий последовательность с +. # в шаблоне соответствует началу каждого элемента на входе; на самом деле он ничего не потребляет, поэтому замена на + просто добавит + перед каждым элементом. Вы можете увидеть это в действии с помощью простой тестовой функции:

$ function tst() { echo ${@/#/+}; }
$ tst 1 2 3
+1 +2 +3

Результат этого затем подставляется в $(( )), который выполняет арифметическое расширение, оценивая выражение внутри него. Конечным результатом является то, что переменная $sample устанавливается равной сумме всех чисел в $sizes.

1 голос
/ 21 апреля 2011

$ {var / old / new} расширяет $ var, заменяя любое «старое» на «новое».$ {var / # old / new} настаивает на том, чтобы начало совпадения в начале значения, которое $ {var / # / new} заменял в начале каждой переменной, применяется ккаждый параметр

$ ((1 + 3)) заменяется арифметическим результатом.

$(( ${@/#/+/ ))

Расширяет $ @, аргументы из набора - $ sizes, добавляет "+" к каждому параметру и пропускает результат через арифметическую оценку.Похоже, что он добавляет все значения в каждой строке.

1 голос
/ 21 апреля 2011

Это арифметическое расширение замены строки.

$(( )) - это арифметическое расширение - например, echo $((1 + 2)).${var/x/y} - замена строки;в этом случае замените первый # в строке на +.$@ - это переменная, которая в этом случае содержит $ size;это заменит строку, а затем будет выглядеть так, как если бы она добавила в нее значения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...