2016-03-16 2 views
0

Пожалуйста, объясните следующий синтаксис:Синтаксис с фунтом и знаком процента после имени параметра оболочки

i##*. 

    i%.* 

Я понимаю, что он делает, но я хочу знать общую картину (почему/как это делает так).

код, где он появляется:

#!/bin/bash 

recursive_name_change() 
{ 
    cd "$1" 
    for i in * 
    do 
     #echo "${i##*.}" 
     if [ -d "$i" ] 
     then 
      recursive_name_change "$i" 
     elif [ "${i##*.}" = "cpp" ] 
     then 
      new_name=${i%.*}".c" 
     mv "$i" "$new_name" 
     fi 
     done 
     cd ../ 
    } 

recursive_name_change . 

Кто-то, пожалуйста, также предполагают, где я могу найти эти своеобразные синтаксические формы от?

+3

Вы даже * попробовали * прочитать страницу пользователя bash и найти '##'? – ghoti

+0

Нет, я не искал его в руководстве bash, но я действительно выполнял поиск в Google, но не имел никаких полезных результатов. –

+1

Ищите «расширение параметра». –

ответ

2

См Parameter Expansion в man bash:

${parameter#word} 
    ${parameter##word} 

Удалить соответствие шаблону префикс. Слово расширяется, чтобы создать шаблон только , как при расширении имени пути. Если шаблон соответствует началу значения параметра , то результатом расширения является расширенное значение параметра с наименьшим совпадающим шаблоном (случай #) или самый длинный совпадающий шаблон (случай ##). Если параметр равен @ или *, операция по удалению применяется к каждому позиционному параметру по очереди, а расширение - . Если параметр представляет собой переменную массива, подстроенную с помощью @ или *, , операция удаления шаблона применяется к каждому члену массива поочередно, , и расширение является результирующим списком.

${parameter%word} 
    ${parameter%%word} 

Удалить соответствующий шаблон суффикса. Слово расширяется, чтобы создать шаблон только , как при расширении имени пути. Если шаблон совпадает с завершающей частью расширенного значения параметра , то результатом расширения является расширение значения параметра с использованием кратчайшего шаблона соответствия (случай %) или самого длинного совпадающего шаблона (случай %%) , Если параметр равен @ или *, , операция удаления рисунка применяется к каждому позиционному параметру по очереди, , и расширение является результирующим списком. Если параметр представляет собой переменную массива с индексом @ или *, операция удаления шаблона применяется к каждому mem- ber массива по очереди, а расширение - это результирующий список.

Короче говоря, # удаляет рисунок слева, % справа, удваивая символ делает соответствующие жадным. (Мнемоника: # находится слева от % на большинстве клавиатур).

+1

's/большинство клавиатур/английские клавиатуры/g' – ceving

0

Посмотрите на секции "удаление подстроки" в this manual:

${string##substring} 

Удаляет самый длинный матч $substring от передней $string.

${string%substring} 

Удаляет короткий матч $substring от задней части $string.

+1

ABS вообще * не * хороший ресурс. Он игнорирует многие оговорки. Игнорирует лучшие практики. Включает код низкого качества. и т. д. –

+0

Тем не менее, он правильно объясняет, что было задано :-) – cd1

+0

Да, но делает это с помощью 'echo $ {unquoted_variable}', что плохо демонстрирует. –

Смежные вопросы