Во-первых, вы должны четко указать, что вы хотите. Если вы знаете, что строка заканчивается, .rtfи вы хотите удалить .rtf, вы можете использовать var2=${var%.rtf}. Если вы не знаете, что такое суффикс, но хотите удалить все, начиная с последнего ., тогда вы можете использовать var2=${var%.*}. Если вы хотите только сохранить все до первого ., вы можете использовать var2=${var%%.*}. Эти два последних варианта имеют одинаковый результат, если есть только один период, но если их может быть больше одного, вы должны решить, какой вы хотите.
Если вы действительно хотите всегда удалять точное количество символов, вот несколько вариантов.
Вы указали bash специально, поэтому мы начнем со встроенных команд bash. Дольше всего работал тот же синтаксис удаления суффиксов, который я использовал выше: чтобы удалить четыре символа, используйте var2=${var%????}. Вам нужно один вопросительный знак на каждый удаленный символ, так что это становится громоздким для больших длин подстрок.
Немного новее извлечения подстроки: var2=${var::${#var}-4}. Здесь вы можете поставить любое число вместо, 4чтобы удалить другое количество символов. (Символ ${#var}заменяется длиной строки, поэтому на самом деле запрашивается оставить первые (длина - 4) символа.)
Более новые версии bash (в частности, 4+, что означает, что та, которая поставляется с MacOS, не будет работать) позволяют упростить это до просто var2=${var::-4}.
Если вы на самом деле не используете bash, а какую-то другую оболочку типа POSIX, удаление суффикса все равно будет работать, даже в простой старой черте (где ни один из остальных не будет). В Zsh, все они работают , но вы должны поставить 0между двоеточием: и var2=${var:0:-4}т.д. В КШ, вам нужно 0 , а также использовать явное выражение длиной 4: var2=${var:0:${#var}-4}.
Конечно, вы можете использовать подстановку команд, чтобы сделать это с помощью служебной программы; Есть много, которые будут работать, но что-то вроде var2=$(cut -c -4 <<<"$var"), вероятно, самый короткий вариант.