Почему вы настаиваете на функции с несколькими возвращаемыми значениями? С помощью OOP вы можете использовать класс, предлагающий регулярную функцию с единственным возвращаемым значением, и любое количество дополнительных «возвращаемых значений», как показано ниже. Преимущество заключается в том, что у вызывающего есть возможность взглянуть на дополнительные элементы данных, но это не требуется для этого. Это предпочтительный метод для сложной базы данных или сетевых вызовов, где может потребоваться много дополнительной информации о возврате в случае возникновения ошибок.
Чтобы ответить на ваш исходный вопрос, в этом примере есть метод возврата частного, это то, что может понадобиться большинству абонентов, и, кроме того, после вызова метода вы можете получить остаток в качестве элемента данных.
class div{
public:
int remainder;
int quotient(int dividend, int divisor){
remainder = ...;
return ...;
}
};
Для лучшего решения (только с функциональностью bash, а не с внешними вызовами) см. один из других ответов .
Следующее будет подходить и не работает требовать, чтобы в системе была программа переименовать
(хотя чаще всего это бывает в системе):
for file in *.html; do
mv "$file" "$(basename "$file" .html).txt"
done
РЕДАКТИРОВАТЬ: Как указано в комментариях, это не работает для имен файлов с пробелами в них без надлежащего цитирования (добавлено выше). При работе исключительно с вашими собственными файлами, которые, как вы знаете, не имеют пробелов в именах файлов, это сработает, но всякий раз, когда вы пишете что-то, что может быть повторно использовано позже, не пропускайте правильное цитирование.
Можно также сделать функцию в Bash, добавить его к .bashrc
или что-то и затем использовать его везде, где Вы хотите.
change-ext() {
for file in *.$1; do mv "$file" "$(basename "$file" .$1).$2"; done
}
Использование:
change-ext css scss
Источник кода в функции: https://stackoverflow.com/a/1224786/6732111
К сожалению, сделать переносимость - нетривиальная задача. Вероятно, вам понадобится немного магии expr.
for file in *.html; do echo mv -- "$file" "$(expr "$file" : '\(.*\)\.html').txt"; done
Удалите эхо, как только вы будете довольны, что оно делает то, что вы хотите.
Изменить: basename
, вероятно, немного более читабельно для этого конкретного случая, хотя expr
в целом более гибкий.
Вы хотите использовать переименовать
:
rename -S .html .txt *.html
Это сделает именно то, что вы хотите - оно изменит расширение с .html
на .txt
для всех файлов, соответствующих *. html
.
Примечание: Грег Хьюгилл правильно указывает, что это не встроенная функция bash; и является отдельной командой Linux. Если вам просто нужно что-то в Linux, это должно работать нормально; если вам нужно что-то более кроссплатформенное, взгляните на один из других ответов.
rename 's/\.html$/\.txt/' *.html
делает именно то, что вы хотите.
При использовании bash нет необходимости во внешних командах, таких как sed, basename, rename, expr и т.д.
for file in *.html
do
mv "$file" "${file%.html}.txt"
done