Я хочу прочитать две строки в качестве параметров bash-скрипта, эти строки должны быть расширениями, затем я хочу заменить расширение файлов первым расширением на второе расширение.

Лучшее, что я мог подумать / найти до сих пор:

#!/bin/bash
first=$1
second=$2
for files in *.$1
do
  mv "$files" "${files%.$1}.$2"
done

Теперь предположим, что $1 - это cpp , а $2 - это C

Мои "сомнения":

  1. будет .$1 будет равно .cpp?
  2. *.$1 равно сказать: *.cpp?
  3. Строка 6 равна mv "$files" "${files%.cpp}.C"?
  4. Будет ли предыдущий код обрабатывать имена файлов с пробелами (например, my file.cpp) или точками (например, my.file.cpp)?

Я знаю, что мог бы ответить на первые 3 вопроса в одном вопросе, но мне нужно понять, что именно происходит, и как каждый оператор (./*/%) Будет работать с данной строкой в параметре.

2 ответа2

1

Ваш код корректен с незначительной запиской Джозефа Р. о файлах, содержащих тире. Однако строки 2 и 3 кажутся избыточными, потому что вы не используете переменные first и second в фрагменте.

Чтобы смягчить ваши "сомнения" (предполагая, что $1 - это cpp , а $2 - это C):

  1. . здесь не оператор, так что bash выполняет только разложение параметров на $1 . Таким образом, ответ да, .$1 равно .cpp
  2. Расширение параметра имеет приоритет над расширением пути (link), что означает *.$1 равно *.cpp
  3. Опять же, строка делает то, что, как вы предполагаете, делает, потому что сначала $1 расширяется для передачи алгоритму сопоставления с образцом, вызванным %
  4. Двойные кавычки не позволяют bash разделять поля, что обычно вызывает проблемы с именами файлов, содержащими пробелы
1

У вас есть две опечатки & вместо $ для адресации переменных, но в противном случае это должно работать.

Также будут работать имена файлов с пробелами, так как вы правильно указали их в кавычках.

Незначительные детали: я бы порекомендовал переименовать переменную $files в $file , поскольку она всегда содержит только одно имя файла из зацикленного списка.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .