Как разные операторы работают с данной строкой


0

Я хочу прочитать две строки в качестве параметров 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 вопроса в одном вопросе, но мне нужно понять, что именно происходит, и как каждый оператор ( ./ */ %) будет работать с данной строкой в ​​параметре.

Ответы:


1

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

Кроме того, имена файлов с пробелами будут работать, так как вы правильно их цитировали.

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


1
Я хотел бы также добавить --к mv(как mv -- "$file" ...) , чтобы убедиться , что он может обрабатывать имена файлов , начиная с -.
Джозеф Р.

@ Joseph R Хороший вопрос, есть ли другие варианты, которые вы рекомендуете добавить в 'mv'? или то, как оно написано, уже может обрабатывать все виды имен файлов?
user2750466

@ user2750466 Я сам не эксперт, но думаю, что это должно охватывать большинство крайних случаев.
Джозеф Р.

1

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

Чтобы смягчить ваши «сомнения» (если $1есть cppи $2есть C):

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

У меня довольно глупый вопрос: будет ли программа работать правильно также, если бы $ 1 и $ 2 были заменены на первое и второе, я имею в виду, если бы я сделал, например: .first или * .first, это дало бы аналогичный результат, верно?
user2750466

Если вы используете, $firstа $secondзатем да. Причина заключается в том, что переменные из $1и $2ни слова расщепления выполняются либо.
Яап Старейшина
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.