Что означает "$ {file%. *}" В bash - PullRequest
0 голосов
/ 29 апреля 2019

Я читаю Используя bash, как я могу удалить расширения всех файлов в определенном каталоге? .Принятый ответ:

for file in "$path"/*; do
    [ -f "$file" ] || continue
    mv "$file" "${file%.*}"
done

Я не понимаю строку:

    mv "$file" "${file%.*}"

, несмотря на чтение ряда ресурсов, таких как http://mywiki.wooledge.org/BashGuide/Patterns

Чтоздесь происходит?

Ответы [ 2 ]

1 голос
/ 29 апреля 2019

Проверьте документацию для замены параметров

${var%Pattern}, ${var%%Pattern}

${var%Pattern} Удалить из$var самая короткая часть $Pattern, которая соответствует заднему концу $var.

${var%%Pattern} Удалить из $var самую длинную часть $Pattern, которая соответствуетконец $var.

В основном говорится заполнить $file полным именем файла и затем удалить все после % с самым коротким соответствием для .*, что будет любымрасширение.

# assume you want to convert myfile.txt to myfile
$file="myfile.txt"
# move the current name to the current name excluding the shortest match of .* = .txt
mv "$file" "${file%.*}"
# expands to
mv "myfile.txt" "myfile"
0 голосов
/ 29 апреля 2019

Это форма Расширение параметра .

"${file%.*}" означает «Переменная file минус все после и включая самый правый период».${file%%.*}" будет ссылаться на крайний левый период.

Это комбинация оператора ${%} и Glob .

edit.Мне было трудно с этим расширением «удаление подстроки», пока я не заметил, что # слева от $, а % справа.Расширения параметров являются важным компонентом использования Bash в качестве языка сценариев;Я рекомендую потренироваться.

...